public Execute ( AbstractMachineState state ) : void | ||
state | AbstractMachineState | |
return | 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();
}
}
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()); }