internal override IEnumerable <CutState> Prove(object[] args, PrologContext context, ushort parentFrame) { object[] goal1Args = null; var newVars = new LogicVariable[FreeVariables.Count]; object[] newArgs = Term.AlphaConvertArglist(HeadArgs, FreeVariables, newVars, context, true); // ReSharper disable UnusedVariable #pragma warning disable 414, 168, 219 foreach (bool ignore in Term.UnifyArraysFast(args, newArgs, context)) #pragma warning restore 414, 168, 219 { if (goal1Args == null) { goal1Args = Term.AlphaConvertArglist(BodyGoals[0].Arguments, FreeVariables, newVars, context, false); } #pragma warning disable 414, 168, 219 foreach (CutState ignoreFreeze in context.ProveAllWokenGoals()) #pragma warning restore 414, 168, 219 { // ReSharper restore UnusedVariable foreach (CutState state1 in context.KnowledgeBase.Prove(BodyGoals[0].Functor, goal1Args, context, parentFrame)) { yield return(state1); } } } }
private ushort StartCallInstruction(PrologContext context, int framePointer, ref ushort pc, out ushort succeedPC, out IEnumerator <CutState> iterator) { int iteratorRegister = code[pc++]; ushort failPC = GetUShort(ref pc); succeedPC = GetUShort(ref pc); iterator = null; // Make the iterator. How we do this depends on the opcode, so re-fetch it. switch ((Opcode)code[pc - CallTargetOffset]) { case Opcode.CallWokenGoals: { if (context.GoalsHaveWoken) { iterator = context.ProveAllWokenGoals().GetEnumerator(); } } break; case Opcode.Call: { // It's a user-defined predicate call PredicateInfo calledPredicate = GetPredicate(ref pc); PushCallArgs(context, framePointer, predicate.Arity, ref pc); iterator = calledPredicate.StackCall(context).GetEnumerator(); } break; case Opcode.CallPrimitive: { // It's a primitive call PrologPrimitives.PrimitiveImplementation implementation = GetPrimitive(ref pc); int arity = code[pc++]; PushCallArgs(context, framePointer, arity, ref pc); iterator = PrologPrimitives.StackCall(implementation, arity, context).GetEnumerator(); } break; default: Debug.Assert(false, "Bad call opcode"); break; } context.SetStack(framePointer, iteratorRegister, iterator); return(failPC); }
internal override IEnumerable <CutState> Prove(object[] args, PrologContext context, ushort parentFrame) { object[] goal1Args = null; object[] goal2Args = null; object[] goal3Args = null; object[] goal4Args = null; object[] goal5Args = null; object[] goal6Args = null; object[] goal7Args = null; object[] goal8Args = null; var newVars = new LogicVariable[FreeVariables.Count]; object[] newArgs = Term.AlphaConvertArglist(HeadArgs, FreeVariables, newVars, context, true); // ReSharper disable UnusedVariable foreach (bool ignore in Term.UnifyArraysFast(args, newArgs, context)) { if (goal1Args == null) { goal1Args = Term.AlphaConvertArglist(BodyGoals[0].Arguments, FreeVariables, newVars, context, false); } foreach (CutState ignoreFreeze in context.ProveAllWokenGoals()) { // ReSharper restore UnusedVariable foreach (CutState state1 in context.KnowledgeBase.Prove(BodyGoals[0].Functor, goal1Args, context, parentFrame)) { if (state1 == CutState.ForceFail) { yield return(CutState.ForceFail); } if (goal2Args == null) { goal2Args = Term.AlphaConvertArglist(BodyGoals[1].Arguments, FreeVariables, newVars, context, false); } foreach (CutState state2 in context.KnowledgeBase.Prove(BodyGoals[1].Functor, goal2Args, context, parentFrame)) { if (state2 == CutState.ForceFail) { yield return(CutState.ForceFail); } if (goal3Args == null) { goal3Args = Term.AlphaConvertArglist(BodyGoals[2].Arguments, FreeVariables, newVars, context, false); } foreach (CutState state3 in context.KnowledgeBase.Prove(BodyGoals[2].Functor, goal3Args, context, parentFrame)) { if (state3 == CutState.ForceFail) { yield return(CutState.ForceFail); } if (goal4Args == null) { goal4Args = Term.AlphaConvertArglist(BodyGoals[3].Arguments, FreeVariables, newVars, context, false); } foreach (CutState state4 in context.KnowledgeBase.Prove(BodyGoals[3].Functor, goal4Args, context, parentFrame)) { if (state4 == CutState.ForceFail) { yield return(CutState.ForceFail); } if (goal5Args == null) { goal5Args = Term.AlphaConvertArglist(BodyGoals[4].Arguments, FreeVariables, newVars, context, false); } foreach (CutState state5 in context.KnowledgeBase.Prove(BodyGoals[4].Functor, goal5Args, context, parentFrame)) { if (state5 == CutState.ForceFail) { yield return(CutState.ForceFail); } if (goal6Args == null) { goal6Args = Term.AlphaConvertArglist(BodyGoals[5].Arguments, FreeVariables, newVars, context, false); } foreach (CutState state6 in context.KnowledgeBase.Prove(BodyGoals[5].Functor, goal6Args, context, parentFrame)) { if (state6 == CutState.ForceFail) { yield return(CutState.ForceFail); } if (goal7Args == null) { goal7Args = Term.AlphaConvertArglist(BodyGoals[6].Arguments, FreeVariables, newVars, context, false); } foreach (CutState state7 in context.KnowledgeBase.Prove(BodyGoals[6].Functor, goal7Args, context, parentFrame)) { if (state7 == CutState.ForceFail) { yield return(CutState.ForceFail); } if (goal8Args == null) { goal8Args = Term.AlphaConvertArglist(BodyGoals[7].Arguments, FreeVariables, newVars, context, false); } foreach (CutState state8 in context.KnowledgeBase.Prove(BodyGoals[7].Functor, goal8Args, context, parentFrame)) { yield return(state8); } } } } } } } } } } }
internal override IEnumerable<CutState> Prove(object[] args, PrologContext context, ushort parentFrame) { object[] goal1Args = null; object[] goal2Args = null; object[] goal3Args = null; object[] goal4Args = null; object[] goal5Args = null; object[] goal6Args = null; object[] goal7Args = null; object[] goal8Args = null; var newVars = new LogicVariable[FreeVariables.Count]; object[] newArgs = Term.AlphaConvertArglist(HeadArgs, FreeVariables, newVars, context, true); // ReSharper disable UnusedVariable foreach (bool ignore in Term.UnifyArraysFast(args, newArgs, context)) { if (goal1Args == null) goal1Args = Term.AlphaConvertArglist(BodyGoals[0].Arguments, FreeVariables, newVars, context, false); foreach (CutState ignoreFreeze in context.ProveAllWokenGoals()) // ReSharper restore UnusedVariable foreach (CutState state1 in context.KnowledgeBase.Prove(BodyGoals[0].Functor, goal1Args, context, parentFrame)) { if (state1 == CutState.ForceFail) yield return CutState.ForceFail; if (goal2Args == null) goal2Args = Term.AlphaConvertArglist(BodyGoals[1].Arguments, FreeVariables, newVars, context, false); foreach (CutState state2 in context.KnowledgeBase.Prove(BodyGoals[1].Functor, goal2Args, context, parentFrame)) { if (state2 == CutState.ForceFail) yield return CutState.ForceFail; if (goal3Args == null) goal3Args = Term.AlphaConvertArglist(BodyGoals[2].Arguments, FreeVariables, newVars, context, false); foreach (CutState state3 in context.KnowledgeBase.Prove(BodyGoals[2].Functor, goal3Args, context, parentFrame)) { if (state3 == CutState.ForceFail) yield return CutState.ForceFail; if (goal4Args == null) goal4Args = Term.AlphaConvertArglist(BodyGoals[3].Arguments, FreeVariables, newVars, context, false); foreach (CutState state4 in context.KnowledgeBase.Prove(BodyGoals[3].Functor, goal4Args, context, parentFrame)) { if (state4 == CutState.ForceFail) yield return CutState.ForceFail; if (goal5Args == null) goal5Args = Term.AlphaConvertArglist(BodyGoals[4].Arguments, FreeVariables, newVars, context, false); foreach (CutState state5 in context.KnowledgeBase.Prove(BodyGoals[4].Functor, goal5Args, context, parentFrame)) { if (state5 == CutState.ForceFail) yield return CutState.ForceFail; if (goal6Args == null) goal6Args = Term.AlphaConvertArglist(BodyGoals[5].Arguments, FreeVariables, newVars, context, false); foreach (CutState state6 in context.KnowledgeBase.Prove(BodyGoals[5].Functor, goal6Args, context, parentFrame)) { if (state6 == CutState.ForceFail) yield return CutState.ForceFail; if (goal7Args == null) goal7Args = Term.AlphaConvertArglist(BodyGoals[6].Arguments, FreeVariables, newVars, context, false); foreach (CutState state7 in context.KnowledgeBase.Prove(BodyGoals[6].Functor, goal7Args, context, parentFrame)) { if (state7 == CutState.ForceFail) yield return CutState.ForceFail; if (goal8Args == null) goal8Args = Term.AlphaConvertArglist(BodyGoals[7].Arguments, FreeVariables, newVars, context, false); foreach (CutState state8 in context.KnowledgeBase.Prove(BodyGoals[7].Functor, goal8Args, context, parentFrame)) { yield return state8; } } } } } } } } } }
internal override IEnumerable<CutState> Prove(object[] args, PrologContext context, ushort parentFrame) { object[] goal1Args = null; object[] goal2Args = null; var newVars = new LogicVariable[FreeVariables.Count]; object[] newArgs = Term.AlphaConvertArglist(HeadArgs, FreeVariables, newVars, context, true); // ReSharper disable UnusedVariable #pragma warning disable 414, 168, 219 foreach (bool ignore in Term.UnifyArraysFast(args, newArgs, context)) #pragma warning restore 414, 168, 219 { if (goal1Args == null) goal1Args = Term.AlphaConvertArglist(BodyGoals[0].Arguments, FreeVariables, newVars, context, false); #pragma warning disable 414, 168, 219 foreach (CutState ignoreFreeze in context.ProveAllWokenGoals()) // ReSharper restore UnusedVariable foreach (CutState state1 in context.KnowledgeBase.Prove(BodyGoals[0].Functor, goal1Args, context, parentFrame)) #pragma warning restore 414, 168, 219 { if (state1 == CutState.ForceFail) yield return CutState.ForceFail; if (goal2Args == null) goal2Args = Term.AlphaConvertArglist(BodyGoals[1].Arguments, FreeVariables, newVars, context, false); foreach (CutState state2 in context.KnowledgeBase.Prove(BodyGoals[1].Functor, goal2Args, context, parentFrame)) yield return state2; } } }