in meta/src/main/java/org/arend/lib/meta/solver/BaseTermCompiler.java [80:96]
public static RingKind getTermCompilerKind(CoreExpression instance, EquationMeta meta) {
CoreExpression instanceNorm = instance.normalize(NormalizationMode.WHNF);
CoreFunctionDefinition instanceDef = instanceNorm instanceof CoreFunCallExpression ? ((CoreFunCallExpression) instanceNorm).getDefinition() : null;
RingKind kind = instanceDef == meta.NatSemiring ? RingKind.NAT : instanceDef == meta.IntRing ? RingKind.INT : instanceDef == meta.RatField ? RingKind.RAT : RingKind.NONE;
if (kind != RingKind.NONE) return kind;
CoreExpression type = instanceNorm.computeType().normalize(NormalizationMode.WHNF);
if (type instanceof CoreClassCallExpression classCall && classCall.getDefinition().isSubClassOf(meta.ext.linearSolverMeta.OrderedAAlgebra)) {
CoreExpression ringImpl = classCall.getAbsImplementationHere(meta.ext.linearSolverMeta.moduleRing);
if (ringImpl != null) {
ringImpl = ringImpl.normalize(NormalizationMode.WHNF);
if (ringImpl instanceof CoreFunCallExpression funCall && funCall.getDefinition() == meta.RatField) {
return RingKind.RAT_ALG;
}
}
}
return RingKind.NONE;
}