in meta/src/main/java/org/arend/lib/meta/simplify/MulOfNegativesRule.java [27:57]
protected Pair<CoreExpression, ConcreteExpression> simplifySubexpression(CoreExpression subexpr) {
List<CoreExpression> args = mulMatcher.match(subexpr);
if (args != null) {
var left = args.get(args.size() - 2);
var right = args.get(args.size() - 1);
args = negativeMatcher.match(left);
boolean isNegOnTheLeft = args != null;
if (args == null) {
args = negativeMatcher.match(right);
if (args == null) {
return null;
}
}
var firstValue = isNegOnTheLeft ? args.get(0) : left;
var secondValue = isNegOnTheLeft ? right : args.get(0);
ConcreteExpression negPath = isNegOnTheLeft ? factory.ref(ext.equationMeta.negMulLeft.getRef()) : factory.ref(ext.equationMeta.negMulRight.getRef());
if (firstValue != null) {
var subexprPath = factory.appBuilder(negPath)
.app(factory.hole(), false)
.app(factory.core(firstValue.computeTyped()), false)
.app(factory.core(secondValue.computeTyped()), false).build();
var newExpr = factory.appBuilder(factory.ref(ext.equationMeta.negative.getRef())).
app(factory.appBuilder(factory.ref(ext.equationMeta.mul.getRef())).app(factory.core(firstValue.computeTyped())).app(factory.core(secondValue.computeTyped())).build()).build();
var checkedNewExpr = typechecker.typecheck(newExpr, subexpr.computeType());
if (checkedNewExpr == null) return null;
return new Pair<>(checkedNewExpr.getExpression(), subexprPath);
}
}
return null;
}