private bool Unify(IHerbrandObject x, IHerbrandObject y) { x = this.findUnion.GetRepresentant(x); y = this.findUnion.GetRepresentant(y); if (x == y) { return(true); } if (y is TypeVariable) { (x, y) = (y, x); } if (x is TypeVariable) { this.findUnion.Union(x, y); return(true); } if (x.GetTag() != y.GetTag() || x.GetArguments().Count() != y.GetArguments().Count()) { return(false); } this.findUnion.Union(x, y); return(x.GetArguments() .Zip(y.GetArguments(), (first, second) => (first, second)) .All(tuple => this.Unify(tuple.first, tuple.second))); }
private static IEnumerable <IHerbrandObject> GetAllHerbrandObjects(IHerbrandObject root) { yield return(root); foreach (var obj in root.GetArguments().SelectMany(GetAllHerbrandObjects)) { yield return(obj); } }
private void Dfs( IHerbrandObject v, ISet <IHerbrandObject> visited, IDictionary <TypeVariable, IHerbrandObject> variableMapping) { if (visited.Contains(v)) { return; } visited.Add(v); if (v is TypeVariable typeVariable) { variableMapping.Add(typeVariable, this.findUnion.GetRepresentant(v)); } else { foreach (var child in v.GetArguments()) { this.Dfs(child, visited, variableMapping); } } }