forked from JavaTX/JavaCompilerCore
martelli montanari unification (unfinished)
This commit is contained in:
parent
53dd7b019e
commit
ab7f56db6f
@ -0,0 +1,14 @@
|
||||
package de.dhbwstuttgart.typeinference.unify.interfaces;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import de.dhbwstuttgart.typeinference.unifynew.Unifier;
|
||||
import de.dhbwstuttgart.typinference.unify.model.MPair;
|
||||
|
||||
/**
|
||||
* Standard unification algorithm (e.g. Robinson, Paterson-Wegman, Martelli-Montanari, Ruzicka-Privara or Suciu)
|
||||
* @author Florian Steurer
|
||||
*/
|
||||
public interface IUnify {
|
||||
public Unifier unify(Set<MPair> terms);
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
package de.dhbwstuttgart.typeinference.unifynew;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import de.dhbwstuttgart.typeinference.unify.interfaces.IUnify;
|
||||
import de.dhbwstuttgart.typinference.unify.model.MPair;
|
||||
import de.dhbwstuttgart.typinference.unify.model.MPair.PairOperator;
|
||||
import de.dhbwstuttgart.typinference.unify.model.Type;
|
||||
import de.dhbwstuttgart.typinference.unify.model.TypeParams;
|
||||
|
||||
/**
|
||||
* Implementation of the Martelli-Montanari unification algorithm.
|
||||
* @author Florian Steurer
|
||||
*/
|
||||
public class MartelliMontanariUnify implements IUnify {
|
||||
|
||||
@Override
|
||||
public Unifier unify(Set<MPair> terms) {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean delete(MPair pair) {
|
||||
return pair.getRhsType().equals(pair.getLhsType());
|
||||
}
|
||||
|
||||
private Set<MPair> decompose(MPair pair) {
|
||||
Set<MPair> result = new HashSet<>();
|
||||
|
||||
Type rhs = pair.getRhsType();
|
||||
Type lhs = pair.getLhsType();
|
||||
|
||||
if(!rhs.getName().equals(lhs.getName()) || rhs.getTypeParams().size() != lhs.getTypeParams().size())
|
||||
return null; // conflict
|
||||
|
||||
TypeParams rhsTypeParams = rhs.getTypeParams();
|
||||
TypeParams lhsTypeParams = lhs.getTypeParams();
|
||||
|
||||
for(int i = 0; i < rhsTypeParams.size(); i++)
|
||||
result.add(new MPair(rhsTypeParams.get(i), lhsTypeParams.get(i), PairOperator.EQUALSDOT));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private MPair swap(MPair pair) {
|
||||
Type rhs = pair.getRhsType();
|
||||
Type lhs = pair.getLhsType();
|
||||
|
||||
if(lhs.getTypeParams().size() != 0 && rhs.getTypeParams().size() == 0)
|
||||
return new MPair(rhs, lhs, PairOperator.EQUALSDOT);
|
||||
return pair;
|
||||
}
|
||||
|
||||
private Unifier eliminate(MPair pair) {
|
||||
Type rhs = pair.getRhsType();
|
||||
Type lhs = pair.getLhsType();
|
||||
|
||||
TypeParams rhsTypeParams = rhs.getTypeParams();
|
||||
|
||||
for(Type t : rhsTypeParams)
|
||||
if(lhs.equals(t))
|
||||
return new Unifier(); //identity-"unifier"
|
||||
|
||||
return new Unifier(lhs, rhs);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
@ -13,6 +13,13 @@ public class Unifier implements Function<Type, Type> {
|
||||
this.source = source;
|
||||
this.target = target;
|
||||
}
|
||||
|
||||
/**
|
||||
* Identity function as an "unifier".
|
||||
*/
|
||||
public Unifier() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type apply(Type t) {
|
||||
|
Loading…
Reference in New Issue
Block a user