public override WamReferenceTarget Clone() { var result = new WamVariable(Generation); if (Target != null) { result.Target = Target.Clone(); } return result; }
public override WamReferenceTarget Clone() { var result = new WamVariable(Generation); if (Target != null) { result.Target = Target.Clone(); } return(result); }
void Trail(WamVariable variable) { if (ChoicePoint == null) { return; } if (variable.Generation <= ChoicePoint.Generation) { ChoicePoint.Trail.Add(variable); } }
public CodeVariable Lookup(WamVariable wamVariable) { if (wamVariable == null) { throw new ArgumentNullException("wamVariable"); } CodeVariable codeVariable; if (!_variables.TryGetValue(wamVariable, out codeVariable)) { ++_count; codeVariable = new CodeVariable(string.Format("V{0}", _count)); _variables.Add(wamVariable, codeVariable); } return codeVariable; }
public CodeVariable Lookup(WamVariable wamVariable) { if (wamVariable == null) { throw new ArgumentNullException("wamVariable"); } CodeVariable codeVariable; if (!_variables.TryGetValue(wamVariable, out codeVariable)) { ++_count; codeVariable = new CodeVariable(string.Format("V{0}", _count)); _variables.Add(wamVariable, codeVariable); } return(codeVariable); }
public static bool FindAll(WamMachine machine, WamReferenceTarget[] arguments) { Debug.Assert(arguments.Length == 3); WamReferenceTarget arg0 = arguments[0].Dereference(); WamReferenceTarget arg1 = arguments[1].Dereference(); WamReferenceTarget arg2 = arguments[2].Dereference(); WamVariable variable = arg0 as WamVariable; if (variable == null) { return(false); } WamCompoundTerm goal = arg1 as WamCompoundTerm; if (goal == null) { return(false); } WamVariable result = arg2 as WamVariable; if (result == null) { return(false); } WamInstructionStreamBuilder builder = new WamInstructionStreamBuilder(); builder.Write(new WamInstruction(WamInstructionOpCodes.Allocate)); for (int idx = 0; idx < goal.Functor.Arity; ++idx) { builder.Write(new WamInstruction( WamInstructionOpCodes.PutValue, goal.Children[idx], new WamInstructionRegister(WamInstructionRegisterTypes.Argument, (byte)idx))); } builder.Write(new WamInstruction(WamInstructionOpCodes.Call, goal.Functor)); builder.Write(new WamInstruction(WamInstructionOpCodes.Success)); machine.PushContext(builder.ToInstructionStream()); List <WamReferenceTarget> values = new List <WamReferenceTarget>(); try { ExecutionResults results = machine.RunToSuccess(); while (results == ExecutionResults.Success) { WamReferenceTarget value = variable.Clone(); values.Add(value); results = machine.RunToSuccess(); } } finally { machine.PopContext(true); } // Unbind the variable from the last results found by the goal. // variable.Unbind(); // Unify the output variable with the list of values. // return(machine.Unify(result, WamReferenceTarget.Create(values))); }
private void Trail(WamVariable variable) { if (ChoicePoint != null) { if (variable.Generation <= ChoicePoint.Generation) { ChoicePoint.Trail.Add(variable); } } }
private void Bind(WamVariable variable, WamReferenceTarget target) { variable.Bind(target); Trail(variable); }
void Bind(WamVariable variable, WamReferenceTarget target) { variable.Bind(target); Trail(variable); }
void Trail(WamVariable variable) { if (ChoicePoint == null) return; if (variable.Generation <= ChoicePoint.Generation) { ChoicePoint.Trail.Add(variable); } }