sclass NLLogicChecker_v2 { S input; new L facts; StringMatcher matcher = new NLStringMatcher_noVars; sclass Matching { SS matches; // var -> match new L output; } bool checkRule(IfThen rule, Matching m) { if (rule == null) false; if (!checkExpression(rule.in, m)) false; m.output.add(apply(rule.out, m)); true; } Exp apply(Exp e, Matching m) { if (e == null) null; if (e cast And) ret And(apply(e.a, m), apply(e.b, m)); if (e cast Func) { S s = join(((Sentence) e.arg).tok); ret Func(Sentence(javaTok(matcher.apply(s, m.matches)))); } ret e; } bool checkExpression(Exp e, Matching m) { if (e cast And) ret checkExpression(e.a, m) && checkExpression(e.b, m); if (e cast Func) { if (eq(e.name, "input")) ret matcher.match(join(((Sentence) e.arg).tok), input, m.matches); else if (eq(e.name, "fact")) { S pat = join(((Sentence) e.arg).tok); for (S fact : facts) if (matcher.match(pat, fact, m.matches)) true; } } false; } }