static SS nlLogic_expandMacros_funcShortNames = litmap( 'o, 'output, 'i, 'input); // changes original rules static void nlLogic_expandMacros(L rules) { for (IfThen rule : unnull(rules)) pcall { nlLogic_expandMacros(rule); } } static IfThen nlLogic_expandMacros(IfThen r) { if (r == null) ret r; Exp out = r.out; int varCount = 0; if (out cast Func) { S name = out.name; if (eq(name, 'sayIfTrue)) { r.out = Func('output, out.arg); r.in = And(r.in, Func('fact, out.arg)); } else if (eq(name, 'inputToFact)) { r.out = Func('fact, out.arg); r.in = nlLogic_and(Func('input, restructure(out.arg)), r.in); } else if (eqOneOf(name, 'outputEval, 'evalOutput)) { S var = "$_" + ++varCount; r.out = Func('output, Sentence2(var)); r.in = And(r.in, Eq(Sentence2(var), Func('eval, out.arg))); //print("Rewritten rule => " + sfu(r)); } } nlLogic_visit(r, voidfunc(O o) { if (o cast Func) { S name = nlLogic_expandMacros_funcShortNames.get(o.name); if (name != null) o.name = name; } }); // LHS only nlLogic_visit(r.in, voidfunc(O o) { // english a/an magic if (o cast Func) if (eqOneOf(o.name, 'input, 'fact)) { S s = ai_expandPatternForAAndAn(o.arg.text()); if (s != null) o.arg = Sentence2(s); } }); ret r; }