public override object Execute(Reasoner ts, Unifier un, ITerm[] args) { CheckArguments(args); Circumstance C = ts.GetCircumstance(); C.ClearRunningIntentions(); C.ClearPendingIntentions(); C.ClearPendingActions(); // drop intentions in E IEnumerator <Event> ie = C.GetEventsPlusAtomic(); while (ie.Current != null) { Event e = ie.Current; if (e.IsInternal()) { C.RemoveEvent(e); } } //drop intentions in PE foreach (string ek in C.GetPendingEvents().Keys) { Event e = C.GetPendingEvents()[ek]; if (e.IsInternal()) { C.RemovePendingEvent(ek); } } AtStdLib atia = ts.GetAgent().GetIA(AtStdLib.atAtom) as AtStdLib; atia.CancelAts(); return(true); }
public void FindDesireAndDrop(Reasoner rs, Literal l, Unifier un) { Trigger g = new Trigger(TEOperator.add, TEType.achieve, l); Circumstance C = rs.GetCircumstance(); Unifier bak = un.Clone(); IEnumerator <Intention> itinit = C.GetRunningIntentionsPlusAtomic(); while (itinit.MoveNext()) { Intention i = itinit.Current; if (DropDesire(i, g, rs, un) > 1) { C.DropRunningIntention(i); un = bak.Clone(); } } // dropping the current intention? DropDesire(C.GetSelectedIntention(), g, rs, un); un = bak.Clone(); //dropping G in Events IEnumerator <Event> ie = C.GetEventsPlusAtomic(); while (ie.MoveNext()) { Event e = ie.Current; //Test in the intention Intention i = e.GetIntention(); int r = DropDesire(i, g, rs, un); if (r > 0) { C.RemoveEvent(e); if (r == 1) { C.ResumeIntention(i); } un = bak.Clone(); } else { //Test in the event Trigger t = e.GetTrigger(); if (i != Intention.emptyInt && !i.IsFinished()) { t = t.Capply(i.Peek().GetUnif()); } if (un.Unifies(g, t)) { DropDesireInEvent(rs, e, i); un = bak.Clone(); } } } //dropping G in Pending Events foreach (string ek in C.GetPendingEvents().Keys) { //Test in the intention Event e = C.GetPendingEvents()[ek]; Intention i = e.GetIntention(); int r = DropDesire(i, g, rs, un); if (r > 0) { C.RemovePendingEvent(ek); if (r == 1) { C.ResumeIntention(i); } un = bak.Clone(); } else { //test in the event Trigger t = e.GetTrigger(); if (i != Intention.emptyInt && !i.IsFinished()) { t = t.Capply(i.Peek().GetUnif()); } if (un.Unifies(g, t)) { DropDesireInEvent(rs, e, i); un = bak.Clone(); } } } //Dropping from pending Actions foreach (ExecuteAction a in C.GetPendingActions().Values) { Intention i = a.GetIntention(); int r = DropDesire(i, g, rs, un); if (r > 0) //i was changed { C.RemovePendingAction(i.GetID()); // remove i from PA if (r == 1) // i must continue running { C.ResumeIntention(i); // and put the intention back in I } // if r > 1, the event was generated and i will be back soon un = bak.Clone(); } } //Dropping from pending intentions foreach (Intention i in C.GetPendingIntentions().Values) { int r = DropDesire(i, g, rs, un); if (r > 0) { C.RemovePendingIntention(i.GetID()); if (r == 1) { C.ResumeIntention(i); } un = bak.Clone(); } } }
override public object Execute(Reasoner ts, Unifier un, ITerm[] args) { CheckArguments(args); Trigger g = new Trigger(TEOperator.add, TEType.achieve, (Literal)args[0]); Circumstance C = ts.GetCircumstance(); // Search the goal in PI IEnumerator <string> ik = C.GetPendingIntentions().Keys.GetEnumerator(); while (ik.MoveNext()) { string k = ik.Current; Intention i = C.GetPendingIntentions()[k]; if (i.IsSuspended() && i.HasTrigger(g, un)) { i.SetSuspended(false); bool notify = true; if (k.StartsWith(SuspendStdLib.SUSPENDED_INT)) // if not SUSPENDED_INT, it was suspended while already in PI, so, do not remove it from PI, just change the suspeded status { ik.Dispose(); // add it back in I if not in PA if (!C.GetPendingActions().ContainsKey(i.GetID())) { C.ResumeIntention(i); notify = false; // the resumeIntention already notifies } } // notify meta event listeners if (notify && C.GetListeners() != null) { foreach (ICircumstanceListener el in C.GetListeners()) { el.IntentionResumed(i); } } // remove the IA .suspend in case of self-suspend if (k.StartsWith(SuspendStdLib.SELF_SUSPENDED_INT)) { i.Peek().RemoveCurrentStep(); } //System.out.println("res "+g+" from I "+i.getId()); } } // Search the goal in PE ik = C.GetPendingEvents().Keys.GetEnumerator(); while (ik.MoveNext()) { string k = ik.Current; if (k.StartsWith(SuspendStdLib.SUSPENDED_INT)) { Event e = C.GetPendingEvents()[k]; Intention i = e.GetIntention(); if (un.Unifies(g, e.GetTrigger()) || (i != null && i.HasTrigger(g, un))) { ik.Dispose(); C.AddEvent(e); if (i != null) { i.SetSuspended(false); } } } } return(true); }