unifier fixed (no iterated application necessary anymore)

This commit is contained in:
Florian Steurer 2016-03-14 12:59:31 +01:00
parent 6778160315
commit 863904a4e8
3 changed files with 10 additions and 21 deletions

View File

@ -41,16 +41,13 @@ public final class TypeParams implements Iterable<Type>{
} }
public boolean occurs(PlaceholderType t) { public boolean occurs(PlaceholderType t) {
for(Type p : typeParams) { for(Type p : typeParams)
if(p instanceof PlaceholderType) { if(p instanceof PlaceholderType)
if(p.equals(t)) if(p.equals(t))
return true; return true;
} else { else
if(p.getTypeParams().occurs(t)) if(p.getTypeParams().occurs(t))
return true; return true;
}
}
return false; return false;
} }

View File

@ -21,6 +21,9 @@ public class Unifier implements Function<Type, Type> {
} }
public void Add(PlaceholderType source, Type target) { public void Add(PlaceholderType source, Type target) {
Unifier tempU = new Unifier(source, target);
for(PlaceholderType pt : substitutions.keySet())
substitutions.put(pt, substitutions.get(pt).apply(tempU));
substitutions.put(source, target); substitutions.put(source, target);
} }

View File

@ -67,7 +67,9 @@ public class MartelliMontanariUnify implements IUnify {
continue; continue;
} }
if(!check(pair)) // Occurs-Check // Occurs-Check
if(pair.getLhsType() instanceof PlaceholderType
&& pair.getRhsType().getTypeParams().occurs((PlaceholderType) pair.getLhsType()))
return Optional.empty(); return Optional.empty();
Optional<Entry<PlaceholderType, Type>> optUni = eliminate(pair); Optional<Entry<PlaceholderType, Type>> optUni = eliminate(pair);
@ -120,20 +122,7 @@ public class MartelliMontanariUnify implements IUnify {
return Optional.empty(); return Optional.empty();
} }
private boolean check(MPair pair) {
Type rhs = pair.getRhsType();
Type lhs = pair.getLhsType();
TypeParams rhsTypeParams = rhs.getTypeParams();
for(Type t : rhsTypeParams)
if(lhs.equals(t))
return false;
return true;
}
private Optional<Entry<PlaceholderType, Type>> eliminate(MPair pair) { private Optional<Entry<PlaceholderType, Type>> eliminate(MPair pair) {
Type rhs = pair.getRhsType(); Type rhs = pair.getRhsType();
Type lhs = pair.getLhsType(); Type lhs = pair.getLhsType();