示例#1
0
        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);
        }