예제 #1
0
파일: Unifier.cs 프로젝트: nasa03/Jasonity
        public bool Bind(VarTerm vt, ITerm term)
        {
            if (vt.Negated()) // Negated variables unify only with negated literals
            {
                if (!term.IsLiteral() || !((Literal)term).Negated())
                {
                    return(false);
                }
                term = (Literal)term.Clone();
                ((Literal)term).SetNegated(Literal.LPos);
            }

            // Namespace
            if (term.IsLiteral())
            {
                Literal lterm = (Literal)term;
                if (!UnifiesNamespace(vt, lterm))
                {
                    return(false);
                }
                if (lterm.GetNS() != Literal.DefaultNS)
                {
                    term = (ITerm)lterm.CloneNS(Literal.DefaultNS);
                }
            }
            if (!term.IsCyclicTerm() && term.HasVar(vt, this))
            {
                term = new CyclicTerm((Literal)term, (VarTerm)vt.Clone());
            }
            function.Add(GetVarForUnifier(vt), term);
            return(true);
        }