in meta/src/main/java/org/arend/lib/pattern/PatternUtils.java [229:264]
public static CoreExpression eval(CoreElimBody body, LevelSubstitution levelSubst, List<? extends CorePattern> patterns, List<? extends TypedExpression> removedArgs, ExpressionTypechecker typechecker, StdExtension ext, ConcreteFactory factory, Map<CoreBinding, ArendRef> bindings) {
loop:
for (CoreElimClause clause : body.getClauses()) {
Map<CoreBinding, CorePattern> subst1 = new HashMap<>();
Map<CoreBinding, CorePattern> subst2 = new HashMap<>();
if (unify(clause.getPatterns(), patterns, subst1, subst2)) {
for (CorePattern value : subst2.values()) {
if (value.getBinding() == null) {
continue loop;
}
}
AbstractedExpression expr = clause.getAbstractedExpression();
if (expr == null) {
return null;
}
CoreParameter param = getAllBindings(clause.getPatterns());
if (param == null) {
return (CoreExpression) expr;
}
Map<CoreBinding, TypedExpression> removedMap = new HashMap<>();
for (int i = 0; i < removedArgs.size(); i++) {
CoreBinding binding = clause.getPatterns().get(i).getBinding();
if (removedArgs.get(i) != null && binding != null) {
removedMap.put(binding, removedArgs.get(i));
}
}
List<ConcreteExpression> args = new ArrayList<>();
for (; param.hasNext(); param = param.getNext()) {
TypedExpression removed = removedMap.get(param.getBinding());
args.add(removed != null ? factory.core(removed) : toExpression(subst1.get(param.getBinding()), ext, factory, bindings));
}
return (CoreExpression) typechecker.substituteAbstractedExpression(expr, levelSubst, args, null);
}
}
return null;
}