Package net.hydromatic.morel.util
Class Unifier
- java.lang.Object
-
- net.hydromatic.morel.util.Unifier
-
- Direct Known Subclasses:
MartelliUnifier,RobinsonUnifier
public abstract class Unifier extends java.lang.ObjectGiven pairs of terms, finds a substitution to minimize those pairs of terms.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceUnifier.ActionCalled by the unifier when a Term's type becomes known.private static classUnifier.CycleExceptionControl flow exception, thrown byUnifier.Term.checkCycle(Map, Map)if it finds a cycle in a substitution map.static classUnifier.FailureResult indicating that unification was not possible.static interfaceUnifier.ResultResult of attempting unification.static classUnifier.SequenceA sequence of terms.static classUnifier.SubstitutionThe results of a successful unification.static interfaceUnifier.TermTerm (variable, symbol or node).static classUnifier.TermTermA pair of terms.static interfaceUnifier.TermVisitor<R>Visitor for terms.static classUnifier.VariableA variable that represents a symbol or a sequence; unification's task is to find the substitutions for such variables.
-
Field Summary
Fields Modifier and Type Field Description private java.util.Map<java.lang.String,Unifier.Sequence>atomMap(package private) static Unifier.SubstitutionEMPTYprivate java.util.Map<java.lang.String,Unifier.Sequence>sequenceMapprivate java.util.Map<java.lang.String,Unifier.Variable>variableMapprivate intvarId
-
Constructor Summary
Constructors Constructor Description Unifier()
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description Unifier.Sequenceapply(java.lang.String operator, java.lang.Iterable<Unifier.Term> args)Creates a sequence, or returns an existing one with the same terms.Unifier.Sequenceapply(java.lang.String operator, Unifier.Term... args)Creates a sequence, or returns an existing one with the same terms.Unifier.Termatom(java.lang.String name)Creates an atom, or returns an existing one with the same name.private static voidcheckCycles(java.util.Map<Unifier.Variable,Unifier.Term> map, java.util.Map<Unifier.Variable,Unifier.Variable> active)protected Unifier.Failurefailure(java.lang.String reason)booleanoccurs()Whether this unifier checks for cycles in substitutions.(package private) static Unifier.SequencesequenceApply(java.lang.String operator, java.util.Map<Unifier.Variable,Unifier.Term> substitutions, java.lang.Iterable<Unifier.Term> terms)Unifier.Substitutionsubstitution(Unifier.Term... varTerms)Creates a substitution.abstract Unifier.Resultunify(java.util.List<Unifier.TermTerm> termPairs, java.util.Map<Unifier.Variable,Unifier.Action> termActions)Unifier.Variablevariable()Creates a new variable, with a new name.Unifier.Variablevariable(java.lang.String name)Creates a variable, or returns an existing one with the same name.
-
-
-
Field Detail
-
EMPTY
static final Unifier.Substitution EMPTY
-
varId
private int varId
-
variableMap
private final java.util.Map<java.lang.String,Unifier.Variable> variableMap
-
atomMap
private final java.util.Map<java.lang.String,Unifier.Sequence> atomMap
-
sequenceMap
private final java.util.Map<java.lang.String,Unifier.Sequence> sequenceMap
-
-
Method Detail
-
occurs
public boolean occurs()
Whether this unifier checks for cycles in substitutions.
-
apply
public Unifier.Sequence apply(java.lang.String operator, Unifier.Term... args)
Creates a sequence, or returns an existing one with the same terms.
-
apply
public Unifier.Sequence apply(java.lang.String operator, java.lang.Iterable<Unifier.Term> args)
Creates a sequence, or returns an existing one with the same terms.
-
variable
public Unifier.Variable variable(java.lang.String name)
Creates a variable, or returns an existing one with the same name.
-
variable
public Unifier.Variable variable()
Creates a new variable, with a new name.
-
atom
public Unifier.Term atom(java.lang.String name)
Creates an atom, or returns an existing one with the same name.
-
substitution
public Unifier.Substitution substitution(Unifier.Term... varTerms)
Creates a substitution.The arguments are alternating variable / term pairs. For example,
substitution(a, x, b, y)becomes [a/X, b/Y].
-
sequenceApply
static Unifier.Sequence sequenceApply(java.lang.String operator, java.util.Map<Unifier.Variable,Unifier.Term> substitutions, java.lang.Iterable<Unifier.Term> terms)
-
unify
@Nonnull public abstract Unifier.Result unify(java.util.List<Unifier.TermTerm> termPairs, java.util.Map<Unifier.Variable,Unifier.Action> termActions)
-
checkCycles
private static void checkCycles(java.util.Map<Unifier.Variable,Unifier.Term> map, java.util.Map<Unifier.Variable,Unifier.Variable> active) throws Unifier.CycleException
- Throws:
Unifier.CycleException
-
failure
protected Unifier.Failure failure(java.lang.String reason)
-
-