Axiom.Runtime.Instructions.CallVariableInstruction.Execute C# (CSharp) Метод

Execute() публичный Метод

public Execute ( AbstractMachineState state ) : void
state AbstractMachineState
Результат void
        public override void Execute(AbstractMachineState state)
        {
            AMProgram program = (AMProgram)state.Program;

            AbstractTerm X0 = (AbstractTerm)state[_vn];

            string predicateName = null;
            int predicateArity = 0;

            if (X0.IsList)
            {
                throw new Exception("callvar: cannot call a list.");
            }
            else if (X0.IsReference)
            {
                throw new Exception("callvar: cannot call an unbound variable.");
            }
            else if (X0.IsConstant)
            {
                int val;

                if (Int32.TryParse((string)X0.Data(), out val))
                {
                    throw new Exception("callvar: cannot call an int.");
                }
                predicateName = (string)X0.Data();
            }
            else if (X0.IsStructure)
            {
                // TODO: should we maybe handle built-in predicates?
                predicateName = X0.Name;
                predicateArity = X0.Arity;
            }

             if (program.IsDefined(predicateName + "/" + predicateArity))
            {
                program.CP = program.P.Next;
                program.NumberOfArguments = predicateArity;
                program.P = program[predicateName + "/" + predicateArity];
                // TODO: B0 should be set to B
            }
            else
            {
                state.Backtrack();
            }
        }

Usage Example

        public void CallVar()
        {
            AbstractMachineState state = SetupMachine();

            CallVariableInstruction i = new CallVariableInstruction();

            i.Process(new string [] { "X0" });

            AMProgram program = (AMProgram)state.Program;

            ProgramClause x = new ProgramClause("male", 1);

            program.AddLabel("male/1", x);

            AbstractTerm X0 = (AbstractTerm)state["X0"];

            StructureTerm s = new StructureTerm("male", 1);
            s.Next = new ConstantTerm("ali");

            X0.Assign(s);

            i.Execute(state);

            Assert.AreSame(program.P, x);
            Assert.AreEqual("callvar", i.Name());
            Assert.AreEqual(1, i.NumberOfArguments());
        }