sS ai_ruleOfThree_solver_4(S db, S input) { ret fixAOrAn(getVar(lastThat(ti -> !isTrue(getOptDyn(ti, "splitOffSuffixes")), too_transformInput_returnAll(input, too -> { // load rules too.addAll(lambdaMap ai_parseBasicLogicRule(tlft(db))); // find suffixes, transform everything accordingly too.addTransformer(func(BasicLogicRule r) { Set suffixes = ai_suffixesFromSharedWordStarts(r); if (nempty(suffixes)) { print(+suffixes); // found suffixes. now transform all inputs & rules too.addTransformer(func(IInput i) { setOptAndReturn(TransformedInput(ai_splitOffWordSuffixes(suffixes, i!)), splitOffSuffixes := true) }); too.addTransformer(func(BasicLogicRule r) { mapBasicLogicRule(r, s -> ai_splitOffWordSuffixes(suffixes, s)) }); // tack suffixes back on too.addTransformer(func(IInput i) { TransformedInput(ai_remergeWordSuffixes(suffixes, i!)) }); } null; }); // turn words appearing in LHS and RHS into variables too.addTransformer(f, O> ai_sharedPhrasesIntoDollarVars); // match input with rules too_flexMatchRulesToTransformInput(too); })))); }