in meta/src/main/java/org/arend/lib/level/StdLevelProver.java [47:80]
private ConcreteExpression proveProp(CoreExpression expression, ConcreteReferenceExpression leftExpr, ConcreteReferenceExpression rightExpr, ConcreteSourceNode marker, ConcreteFactory factory, ExpressionTypechecker typechecker) {
CoreExpression type = expression.normalize(NormalizationMode.WHNF);
CoreExpression typeType = type.computeType().normalize(NormalizationMode.WHNF);
if (typeType instanceof CoreUniverseExpression && ((CoreUniverseExpression) typeType).getSort().isProp()) {
return factory.app(factory.ref(ext.propIsProp.getRef()), true, Arrays.asList(leftExpr, rightExpr));
}
if (type instanceof CoreDataCallExpression) {
ConcreteExpression result = provePropDataType((CoreDataCallExpression) type, leftExpr, rightExpr, marker, factory);
if (result != null) {
return result;
}
}
for (CoreBinding binding : typechecker.getFreeBindingsList()) {
List<CoreParameter> parameters = new ArrayList<>();
CoreExpression codomain = binding.getTypeExpr().getPiParameters(parameters);
if (parameters.size() != 2) {
continue;
}
CoreFunCallExpression equality = codomain.toEquality();
if (equality != null) {
List<? extends CoreExpression> args = equality.getDefCallArguments();
if (args.get(1) instanceof CoreReferenceExpression && args.get(2) instanceof CoreReferenceExpression && ((CoreReferenceExpression) args.get(1)).getBinding() == parameters.get(0).getBinding() && ((CoreReferenceExpression) args.get(2)).getBinding() == parameters.get(1).getBinding() && typechecker.compare(args.get(0), type, CMP.EQ, marker, false, true, false)) {
return factory.app(factory.ref(binding), true, Arrays.asList(leftExpr, rightExpr));
}
}
}
// TODO: Sigma types, pi types, equality (i.e., rising level), heterogeneous path types, recursive data types, dependently typed constructors
return ext.contradictionMeta.check(null, null, true, marker, typechecker);
}