Beispiel #1
0
        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)));
        }
Beispiel #2
0
        private static IEnumerable <IHerbrandObject> GetAllHerbrandObjects(IHerbrandObject root)
        {
            yield return(root);

            foreach (var obj in root.GetArguments().SelectMany(GetAllHerbrandObjects))
            {
                yield return(obj);
            }
        }
Beispiel #3
0
        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);
                }
            }
        }