public override void Execute(AbstractMachineState state)
        {
            AMProgram program = (AMProgram)state.Program;
            AMHeap    heap    = (AMHeap)state.DataArea;

            AbstractTerm Ai = ((AbstractTerm)state[_ai]).Dereference();

            if (Ai.IsReference)
            {
                heap.Push(new ListTerm());
                Ai.Bind((AbstractTerm)heap.Top());
                state.IsWriteMode = true;
            }
            else if (Ai.IsList)
            {
                state.S          = Ai.Next;
                state.IsReadMode = true;
            }
            else
            {
                state.Fail = true;
            }

            if (state.Fail)
            {
                state.Backtrack();
            }
            else
            {
                program.Next();
            }
        }
        public void Reference()
        {
            AbstractTerm term1 = new AbstractTerm();
            AbstractTerm term2 = new AbstractTerm();

            term1.Bind(term2);

            Assert.AreSame(term2, term1.Reference());
        }
        public void Dereference()
        {
            AbstractTerm term1 = new AbstractTerm();
            AbstractTerm term2 = new AbstractTerm();
            AbstractTerm term3 = new AbstractTerm();

            term2.Bind(term3);
            term1.Bind(term2);

            Assert.AreSame(term3, term1.Dereference());
        }
Example #4
0
        public override void Execute(AbstractMachineState state)
        {
            AMProgram program = (AMProgram)state.Program;
            AMHeap    heap    = (AMHeap)state.DataArea;

            AbstractTerm Vn = (AbstractTerm)state[_vn];

            if (state.IsReadMode)
            {
                state.Fail = !Vn.Unify((AbstractTerm)state.S);
            }
            else
            {
                AbstractTerm addr = Vn.Dereference();

                if (IsEnvironmentVariable(addr, state))
                {
                    // Push a new variable on the heap
                    AbstractTerm newVariable = new AbstractTerm();
                    heap.Push(newVariable);
                    addr.Bind((AbstractTerm)heap.Top());
                }
                else
                {
                    AbstractTerm newHeapItem = new AbstractTerm();
                    newHeapItem.Assign(addr);
                    heap.Push(newHeapItem);
                }
            }
            if (state.S != null)
            {
                state.S = state.S.Next;
            }

            if (state.Fail)
            {
                state.Backtrack();
            }
            else
            {
                program.Next();
            }
        }
Example #5
0
        public override void Execute(AbstractMachineState state)
        {
            AMProgram program = (AMProgram)state.Program;
            AMHeap    heap    = (AMHeap)state.DataArea;

            AbstractTerm Ai = ((AbstractTerm)state[_ai]).Dereference();

            if (Ai.IsReference)
            {
                heap.Push(new StructureTerm(_structureName, _arity));
                Ai.Bind((AbstractTerm)heap.Top());
                state.IsWriteMode = true;
            }
            else if (Ai.IsStructure)
            {
                if (Ai.Name == _structureName)
                {
                    // set S to next item on heap
                    state.S = Ai.Next;

                    // set read mode
                    state.IsReadMode = true;
                }
                else
                {
                    state.Fail = true;
                }
            }
            else
            {
                state.Fail = true;
            }

            if (state.Fail)
            {
                state.Backtrack();
            }
            else
            {
                program.Next();
            }
        }
Example #6
0
        public override void Execute(AbstractMachineState state)
        {
            AMProgram program = (AMProgram)state.Program;
            AMHeap    heap    = (AMHeap)state.DataArea;


            AbstractTerm Yn = state.E[_yn].Dereference();
            AbstractTerm Ai = (AbstractTerm)state[_ai];

            if (!IsEnvironmentVariable(Yn, state))
            {
                Ai.Assign(Yn);
            }
            else
            {
                heap.Push(new AbstractTerm());
                Yn.Bind((AbstractTerm)heap.Top());
                Ai.Assign(Yn);
            }

            program.Next();
        }
        public override void Execute(AbstractMachineState state)
        {
            AMProgram program = (AMProgram)state.Program;
            AMHeap    heap    = (AMHeap)state.DataArea;

            AbstractTerm Vn = ((AbstractTerm)state[_vn]).Dereference();

            if (IsEnvironmentVariable(Vn, state))
            {
                // Push a new variable on the heap
                AbstractTerm newVariable = new AbstractTerm();
                heap.Push(newVariable);
                Vn.Bind((AbstractTerm)heap.Top());
            }
            else
            {
                AbstractTerm newHeapItem = new AbstractTerm();
                newHeapItem.Assign(Vn);
                heap.Push(newHeapItem);
            }

            program.Next();
        }