public override ITerm CApply(Unifier u) { if (u != null) { ITerm vl = u.Get(this); if (vl != null) { if (!vl.IsCyclicTerm() && vl.HasVar(this, u)) { u.Remove(this); ITerm tempVl = vl.CApply(u); u.Bind(this, vl); CyclicTerm ct = new CyclicTerm(tempVl as Literal, this); Unifier renamedVars = new Unifier(); ct.MakeVarsAnnon(renamedVars); renamedVars.Remove(this); u.Compose(renamedVars); vl = ct; } vl = vl.CApply(u); if (vl.IsLiteral()) { if (GetNS() != Literal.DefaultNS) { vl = (vl.CloneNS(GetNS().CApply(u) as Atom) as Literal); } if (Negated()) { ((Literal)vl).SetNegated(Literal.LNeg); } } if (vl.IsLiteral() && this.HasAnnot()) { vl = ((Literal)vl).ForceFullLiteralImpl().AddAnnots((IListTerm)this.GetAnnots().CApply(u)); } return(vl); } } return((ITerm)Clone()); // Como uso el Clone de C# lo que clono son object que luego hay que castear... }
public override object Execute(Reasoner reasoner, Unifier un, ITerm[] args) { CheckArguments(args); ITerm var = args[0]; ILogicalFormula logExpr = (ILogicalFormula)args[1]; IListTerm all = new ListTermImpl(); IListTerm tail = all; IEnumerator <Unifier> iu = logExpr.LogicalConsequence(reasoner.GetAgent(), un); while (iu.MoveNext()) { tail = tail.Append(var.CApply(iu.Current)); } return(un.Unifies(args[2], all)); }
override public object Execute(Reasoner ts, Unifier un, ITerm[] args) { CheckArguments(args); ITerm var = args[0]; ILogicalFormula logExpr = (ILogicalFormula)args[1]; ISet <ITerm> all = new HashSet <ITerm>(); IEnumerator <Unifier> iu = logExpr.LogicalConsequence(ts.GetAgent(), un); while (iu.MoveNext()) { all.Add(var.CApply(iu.Current)); } return(un.Unifies(args[2], SetToList(all))); }
public bool UnifyTerms(ITerm term, ITerm term2) { if (term.IsArithExpr()) { term = term.CApply(this); } if (term2.IsArithExpr()) { term2 = term2.CApply(this); } bool termIsVar = term.IsVar(); bool term2IsVar = term2.IsVar(); // One of them is a variable if (termIsVar || term2IsVar) { VarTerm termv = termIsVar ? (VarTerm)term : null; VarTerm term2v = term2IsVar ? (VarTerm)term2 : null; // Get their values ITerm termvl = termIsVar ? Get(termv) : term; ITerm term2vl = term2IsVar ? Get(term2v) : term2; if (termvl != null && term2vl != null) // Unify the values of the two variables { return(UnifiesNoUndo(termvl, term2vl)); } else if (termvl != null) // Unify a variable with a value { return(Bind(term2v, termvl)); } else if (term2vl != null) { return(Bind(termv, term2vl)); } else // Unify two variables { if (!UnifyTerms(termv.GetNS(), term2v.GetNS())) { return(false); } if (termv.Negated() != term2v.Negated()) { return(false); } Bind(termv, term2v); return(true); } } // Both terms are not vars // If any of the terms is not a literal (is a number or string), they must be equal // For unification, lists are literals if (!term.IsLiteral() && !term.IsList() || !term2.IsLiteral() && !term2.IsList()) { return(term.Equals(term2)); } // Case of plan body if (term.IsPlanBody() && term2.IsPlanBody()) { IPlanBody pb1 = (IPlanBody)term; IPlanBody pb2 = (IPlanBody)term2; if (pb1.GetBodyTerm() == null && pb2.GetBodyTerm() == null) { return(true); } if (pb1.GetBodyTerm() == null && pb2.GetBodyTerm() != null) { return(false); } if (pb1.GetBodyTerm() != null && pb2.GetBodyTerm() == null) { return(false); } if (pb1.GetBodyTerm().IsVar() && pb2.GetBodyTerm().IsVar()) { if (UnifiesNoUndo(pb1.GetBodyTerm(), pb2.GetBodyTerm())) { return(UnifiesNoUndo(pb1.GetBodyNext(), pb2.GetBodyNext())); } else { return(false); } } if (pb1.GetBodyTerm().IsVar()) { if (pb1.GetBodyNext() == null) { return(UnifiesNoUndo(pb1.GetBodyTerm(), pb2)); } else { if (pb2.GetBodyTerm() == null) { return(false); } if (UnifiesNoUndo(pb1.GetBodyTerm(), pb2.GetHead())) { if (pb2.GetBodyNext() == null) { if (pb1.GetBodyNext() != null && pb1.GetBodyNext().GetBodyTerm().IsVar() && pb1.GetBodyNext().GetBodyNext() == null) { return(UnifiesNoUndo(pb1.GetBodyNext().GetBodyTerm(), new PlanBodyImpl())); } return(false); } else { return(UnifiesNoUndo(pb1.GetBodyNext(), pb2.GetBodyNext())); } } } } else if (pb2.GetBodyTerm().IsVar()) { return(Unifies(pb2, pb1)); } } // Both terms are literal Literal t1s = (Literal)term; Literal t2s = (Literal)term2; // Different arities int ts = t1s.GetArity(); if (ts != t2s.GetArity()) { return(false); } // If both are literal, they must have the same negated if (t1s.Negated() != t2s.Negated()) { return(false); } // Different functor if (!t1s.GetFunctor().Equals(t2s.GetFunctor())) { return(false); } // Different namespace if (!UnifiesNamespace(t1s, t2s)) { return(false); } // Unify inner terms for (int i = 0; i < ts; i++) { if (!UnifiesNoUndo(t1s.GetTerm(i), t2s.GetTerm(i))) { return(false); } } // The first's annotations must be a subset of the second's annotations if (!t1s.HasSubsetAnnot(t2s, this)) { return(false); } return(true); }