private bool RecursiveScanMixedRaio(PlanningParser.SubjectGdContext context, IReadOnlyList <string> variableNameList, IReadOnlyList <IList <string> > collection, StringDictionary assignment, int currentLevel = 0, bool isForall = true) { bool result; if (currentLevel != variableNameList.Count) { string variableName = variableNameList[currentLevel]; result = isForall; bool terminateCondition = !isForall; Func <bool, bool, bool> boolFunc; if (isForall) { boolFunc = (b1, b2) => b1 && b2; } else { boolFunc = (b1, b2) => b1 || b2; } foreach (string value in collection[currentLevel]) { assignment[variableName] = value; bool gdResult = RecursiveScanMixedRaio(context, variableNameList, collection, assignment, currentLevel + 1, isForall); if (gdResult == terminateCondition) { result = terminateCondition; break; } result = boolFunc(result, gdResult); } } else { result = Implies(context, assignment); } return(result); }
public bool Implies(PlanningParser.SubjectGdContext context, StringDictionary assignment) { //Console.WriteLine("Enter implies"); bool result; if (context.KNOW() != null) { //Console.WriteLine("Enter Know"); //CUDD.Print.PrintMinterm(Knowledge); //Console.WriteLine("Whether knowledge is equal to false: {0}", Knowledge.Equals(CUDD.ZERO)); CUDDNode objectNode = context.gd().GetCuddNode(_predicateDict, assignment); //CUDD.Print.PrintMinterm(objectNode); CUDD.Ref(Knowledge); CUDDNode impliesNode = CUDD.Function.Implies(Knowledge, objectNode); result = impliesNode.Equals(CUDD.ONE); } else if (context.BEL() != null) { //Console.WriteLine("Enter belief"); //Console.WriteLine("Belief"); //CUDD.Print.PrintMinterm(Belief); CUDDNode objectNode = context.gd().GetCuddNode(_predicateDict, assignment); //Console.WriteLine("objectNode"); //Console.WriteLine(context.gd().GetText()); //CUDD.Print.PrintMinterm(objectNode); CUDD.Ref(Belief); CUDDNode impliesNode = CUDD.Function.Implies(Belief, objectNode); result = impliesNode.Equals(CUDD.ONE); } else if (context.NOT() != null) { result = !Implies(context.subjectGd(0), assignment); } else if (context.AND() != null) { result = true; for (int i = 0; i < context.subjectGd().Count; i++) { if (!Implies(context.subjectGd(i), assignment)) { result = false; break; } } } else if (context.OR() != null) { result = false; for (int i = 0; i < context.subjectGd().Count; i++) { if (Implies(context.subjectGd(i), assignment)) { result = true; break; } } } else { var listVariableContext = context.listVariable(); var collection = listVariableContext.GetCollection(); var varNameList = listVariableContext.GetVariableNameList(); bool isForall = context.FORALL() != null; result = RecursiveScanMixedRaio(context.subjectGd(0), varNameList, collection, assignment, 0, isForall); } //Console.WriteLine("Implies result: {0}", result); //Console.ReadLine(); return(result); }
public bool Implies(PlanningParser.SubjectGdContext context) { StringDictionary emtpyAssignment = new StringDictionary(); return(Implies(context, emtpyAssignment)); }