!7 sS rule = [[ input(I'm a $scammer!) && fact(a $scammer $scams_people) && relationX($scams_people, $scam_people) => output(You $scam_people?!) ]]; sS input = "I'm a driver"; sS expectedOutput = "You drive cars?!"; p-exp { NLLogicChecker_v2 c = new NLLogicChecker_v2 { bool checkExpression(Exp e, Matching m) { if (e cast Func) { if (eq(e.name, "relationX")) { printStruct("Checking: " + e + " with " + sfu(m.matches)); L l = tok_splitAtComma(javaTokWithBrackets(nlLogic_text(e.arg))); if (l(l) != 2) false; l = mapReplaceVars2(l, m.matches); printStruct(l); if (isDollarVar(second(l)) && !isDollarVar(first(l))) ret strictPutIC(m.matches, second(l), ai_verbPhraseFromThirdPerson(first(l))); ret eqic(second(l), first(l)); } } ret super.checkExpression(e, m); } }; c.matcher = new NLStringMatcher_dollarVars_underscores; c.input = input; c.facts = ll("A driver drives cars"); applyNLLogicFacts_v2_verbose.set(true); applyNLLogicFacts_v2(c, vf_print(), ll(pair(aGlobalID(), nlLogic_parseRule(rule)))); assertEqualsVerbose(ll(expectedOutput), c.posted); }