in meta/src/main/java/org/arend/lib/meta/ContradictionMeta.java [83:117]
private record NegationData(List<RType> types, Deque<Object> instructions) {
private ConcreteExpression makeExpression(Deque<ConcreteExpression> arguments, CoreConstructor constructor, ConcreteFactory factory) {
List<ConcreteArgument> args = new ArrayList<>();
CoreParameter param = constructor.getParameters();
if (param.hasNext() && !param.isExplicit()) {
for (CoreParameter dataParam = constructor.getDataType().getParameters(); dataParam.hasNext(); dataParam = dataParam.getNext()) {
args.add(factory.arg(factory.hole(), false));
}
}
for (; param.hasNext(); param = param.getNext()) {
Object con = instructions.removeFirst();
if (con instanceof CoreConstructor) {
args.add(factory.arg(makeExpression(arguments, (CoreConstructor) con, factory), param.isExplicit()));
} else {
args.add(factory.arg(arguments.removeFirst(), param.isExplicit()));
}
}
return factory.app(factory.ref(constructor.getRef()), args);
}
Negation make(List<CoreParameter> parameters, CoreExpression codomain, ConcreteExpression proof, ConcreteFactory factory) {
return new Negation(types, codomain, arguments -> {
List<ConcreteArgument> args = new ArrayList<>();
for (CoreParameter param : parameters) {
Object con = instructions.removeFirst();
if (con instanceof CoreConstructor) {
args.add(factory.arg(makeExpression(arguments, (CoreConstructor) con, factory), param.isExplicit()));
} else {
args.add(factory.arg(arguments.removeFirst(), param.isExplicit()));
}
}
return factory.app(proof, args);
});
}
}