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);
        }
Example #2
0
        public override object Execute(Reasoner ts, Unifier un, ITerm[] args)
        {
            CheckArguments(args);

            suspendIntention = false;

            Circumstance C = ts.GetCircumstance();

            if (args.Length == 0)
            {
                // suspend the current intention
                Intention i = C.GetSelectedIntention();
                suspendIntention = true;
                i.SetSuspended(true);
                C.AddPendingIntention(SELF_SUSPENDED_INT + i.GetID(), i);
                return(true);
            }

            // use the argument to select the intention to suspend.

            Trigger g = new Trigger(TEOperator.add, TEType.achieve, (Literal)args[0]);

            // ** Must test in PA/PI first since some actions (as .suspend) put intention in PI

            // suspending from Pending Actions
            foreach (ExecuteAction a in C.GetPendingActions().Values)
            {
                Intention ia = a.GetIntention();
                if (ia.HasTrigger(g, un))
                {
                    ia.SetSuspended(true);
                    C.AddPendingIntention(SUSPENDED_INT + ia.GetID(), ia);
                }
            }

            // suspending from Pending Intentions
            foreach (Intention ii in C.GetPendingIntentions().Values)
            {
                if (ii.HasTrigger(g, un))
                {
                    ii.SetSuspended(true);
                }
            }

            IEnumerator <Intention> itint = C.GetRunningIntentionsPlusAtomic();

            while (itint.MoveNext())
            {
                Intention i = itint.Current;
                if (i.HasTrigger(g, un))
                {
                    i.SetSuspended(true);
                    C.RemoveRunningIntention(i);
                    C.AddPendingIntention(SUSPENDED_INT + i.GetID(), i);
                }
            }

            // suspending the current intention? <-(Esta interrogación ya venía, lo juro)
            Intention ci = C.GetSelectedIntention();

            if (ci != null && ci.HasTrigger(g, un))
            {
                suspendIntention = true;
                ci.SetSuspended(true);
                C.AddPendingIntention(SELF_SUSPENDED_INT + ci.GetID(), ci);
            }

            // suspending G in Events
            int c = 0;
            IEnumerator <Event> ie = C.GetEventsPlusAtomic();

            while (ie.MoveNext())
            {
                Event e = ie.Current;
                ci = e.GetIntention();
                if (un.Unifies(g, e.GetTrigger()) || (ci != null && ci.HasTrigger(g, un)))
                {
                    C.RemoveEvent(e);
                    C.AddPendingEvent(SUSPENDED_INT + e.GetTrigger() + (c++), e);
                    if (ci != null)
                    {
                        ci.SetSuspended(true);
                    }
                }
            }
            return(true);
        }
Example #3
0
            void Find()
            {
                switch (curStep)
                {
                case Step.selEvt:
                    curStep = Step.evt;     // set next step

                    // we need to check the selected event in this cycle (already removed from E)
                    if (C.GetSelectedEvent() != null)
                    {
                        Trigger   t = C.GetSelectedEvent().GetTrigger();
                        Intention i = C.GetSelectedEvent().GetIntention();
                        if (i != Intention.emptyInt && !i.IsFinished())
                        {
                            t = (Trigger)t.Capply(i.Peek().GetUnif());
                        }
                        solution = un.Clone();
                        if (solution.UnifiesNoUndo(teFromL, t))
                        {
                            return;
                        }
                    }
                    Find();
                    return;

                case Step.evt:
                    if (evtIterator == null)
                    {
                        evtIterator = C.GetEventsPlusAtomic();
                    }

                    if (evtIterator.MoveNext())
                    {
                        Event     ei = evtIterator.Current;
                        Trigger   t  = ei.GetTrigger();
                        Intention i  = ei.GetIntention();
                        if (i != Intention.emptyInt && !i.IsFinished())
                        {
                            t = t.Capply(i.Peek().GetUnif());
                        }
                        solution = un.Clone();
                        if (solution.UnifiesNoUndo(teFromL, t))
                        {
                            return;
                        }
                    }
                    else
                    {
                        curStep = Step.useIntends;     // set next step
                    }
                    Find();
                    return;

                case Step.useIntends:
                    if (intendInterator == null)
                    {
                        intendInterator = AllIntentions(C, l, intAsTerm, un);
                    }

                    if (intendInterator.MoveNext())
                    {
                        solution = intendInterator.Current;
                        return;
                    }
                    else
                    {
                        curStep = Step.end;     // set next step
                    }
                    break;

                case Step.end:
                    break;
                }
                solution = null; //nothing found
            }
Example #4
0
        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();
                }
            }
        }