Generate steps withLet in every sub-inference of let terms

This commit is contained in:
Johanna Stuber 2021-02-04 19:31:06 +01:00
parent 5c9f916a6c
commit ee18a3cba1
3 changed files with 7 additions and 6 deletions

View File

@ -41,7 +41,7 @@ public class Tree implements TermVisitorTree {
* @param lambdaTerm the lambda term to generate the tree for * @param lambdaTerm the lambda term to generate the tree for
*/ */
protected Tree(Map<VarTerm, TypeAbstraction> typeAssumptions, LambdaTerm lambdaTerm) { protected Tree(Map<VarTerm, TypeAbstraction> typeAssumptions, LambdaTerm lambdaTerm) {
this(typeAssumptions, lambdaTerm, new TypeVariableFactory(TypeVariableKind.TREE)); this(typeAssumptions, lambdaTerm, new TypeVariableFactory(TypeVariableKind.TREE), false);
} }
/** /**
@ -54,13 +54,14 @@ public class Tree implements TermVisitorTree {
* @param typeAssumptions the type assumptions to consider when generating the tree * @param typeAssumptions the type assumptions to consider when generating the tree
* @param lambdaTerm the lambda term to generate the tree for * @param lambdaTerm the lambda term to generate the tree for
* @param typeVariableFactory the type variable factory to use * @param typeVariableFactory the type variable factory to use
* @param partOfLetTerm indicates whether the tree is generated for a sub-inference that is part of a let term
*/ */
protected Tree(Map<VarTerm, TypeAbstraction> typeAssumptions, LambdaTerm lambdaTerm, protected Tree(Map<VarTerm, TypeAbstraction> typeAssumptions, LambdaTerm lambdaTerm,
TypeVariableFactory typeVariableFactory) { TypeVariableFactory typeVariableFactory, boolean partOfLetTerm) {
this.typeVarFactory = typeVariableFactory; this.typeVarFactory = typeVariableFactory;
this.constraints = new ArrayList<>(); this.constraints = new ArrayList<>();
this.stepFactory = lambdaTerm.hasLet() ? new StepFactoryWithLet() : new StepFactoryDefault(); this.stepFactory = lambdaTerm.hasLet() || partOfLetTerm ? new StepFactoryWithLet() : new StepFactoryDefault();
this.firstTypeVariable = typeVarFactory.nextTypeVariable(); this.firstTypeVariable = typeVarFactory.nextTypeVariable();
this.firstInferenceStep = lambdaTerm.accept(this, typeAssumptions, firstTypeVariable); this.firstInferenceStep = lambdaTerm.accept(this, typeAssumptions, firstTypeVariable);

View File

@ -27,12 +27,12 @@ public class TypeInfererLet implements TypeInfererInterface {
* *
* @param lambdaTerm the lambda term to generate the tree for * @param lambdaTerm the lambda term to generate the tree for
* @param typeAssumptions the type assumptions to consider when generating the tree * @param typeAssumptions the type assumptions to consider when generating the tree
* @param typeVarFactory the type variable factory that should be used in this inference to guarantee consistecy * @param typeVarFactory the type variable factory that should be used in this inference to guarantee consistency
* with the outer inference * with the outer inference
*/ */
protected TypeInfererLet(LambdaTerm lambdaTerm, Map<VarTerm, TypeAbstraction> typeAssumptions, protected TypeInfererLet(LambdaTerm lambdaTerm, Map<VarTerm, TypeAbstraction> typeAssumptions,
TypeVariableFactory typeVarFactory) { TypeVariableFactory typeVarFactory) {
tree = new Tree(typeAssumptions, lambdaTerm, typeVarFactory); tree = new Tree(typeAssumptions, lambdaTerm, typeVarFactory, true);
// cancel algorithm if a sub-inference failed // cancel algorithm if a sub-inference failed
if (tree.hasFailedSubInference()) { if (tree.hasFailedSubInference()) {

View File

@ -40,7 +40,7 @@ class TreeTest {
factory.nextTypeVariable(); factory.nextTypeVariable();
factoryRef.nextTypeVariable(); factoryRef.nextTypeVariable();
} }
Tree tree = new Tree(TYPE_ASSUMPTIONS, VAR, factory); Tree tree = new Tree(TYPE_ASSUMPTIONS, VAR, factory, false);
assertEquals(tree.getFirstTypeVariable(), factoryRef.nextTypeVariable()); assertEquals(tree.getFirstTypeVariable(), factoryRef.nextTypeVariable());
} }