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); }