!7 !include once #1027167 // Compact Module Include 2 v2 set flag AllPublic. module WinogradSolver1 > DynSingleFunctionWithPrintLog { transient PhilosophyBot1 engine; transient O multiStage; // unused S prelude = "import bool"; S input = "Bob paid for Charlie's college education. He is very [generous/grateful]. Who is [generous/grateful]?"; Map answers = syncMap(); delegate LogicRule to PhilosophyBot1. replace GroupingAndPatterns with Pair>. void doIt() { // Stage 3a: Select the right rules for the task Cl rulesToUse = dm_getUnclearList("Rules"); // take all for now LS patternsToUse = dm_getUnclearList("Patterns"); doIt(rulesToUse, patternsToUse); } void doIt(Cl rulesToUse, LS patternsToUse) { clear(answers); change(); if (empty(input)) ret; print("Using patterns: " + sfu(patternsToUse)); print("Using rules: " + sfu(rulesToUse)); // Stage 1: take one option out of square brackets for (S variant : winograd_variants(input)) { print(variant); SS _answers = ciMap(); dm_call(multiStage, 'addStage, "Variant", variant); // Stage 1b: Split off 's S input2b = ai_splitOffApostropheS(variant); dm_call(multiStage, 'addStage, "Split off 's", input2b); // Stage 1c: Split into sentences LS sentences = map dropQuestionMark(sentences(input2b)); dm_call(multiStage, 'addStage, "Split into sentences", sentences); // Stage 2: Parser S parser = dm_makeModule("#1027108/TopDownParsing"); //L parsed = map(sentences, s -> dm_call(parser, 'parse, s)); L> groupingsWithPatterns = map(sentences, s -> (Cl) dm_callWithImport(parser, 'parseToGroupingsWithUsedPatterns, s, patterns := patternsToUse)); L groupingsWithPatterns2 = concatLists(groupingsWithPatterns); Map> groupingToUsedPatterns = pairsToMap(groupingsWithPatterns2); //L> parsed = map(sentences, s -> (Cl) dm_call(parser, 'parseToGroupings, s)); //pnl(parsed); Set allGroupings = toCISet(pairsA(groupingsWithPatterns2)); print("Have " + n2(allGroupings, "grouping")); //dm_call(multiStage, 'addStage, "Parser", parsed); // Stage 3b: Run logic engine S program = joinWithEmptyLines(concatLists(ll(prelude), allGroupings, rulesToUse)); engine = PhilosophyBot1(program); engine.standardImports(); engine.enableTrails(); engine.parseProgram(); for (S s : allGroupings) { //print("Setting trail for " + quote(s)); engine.setTrail(s, "grouped original input"); } engine.printFactsAfterThinking = false; L initialRules = engine.logicRules(); engine.think(); engine.printDeducedFactsWithTrails(); Set allOriginalGroupings = cloneSet(allGroupings); // gather simplified versions of questions so we find their answers too LPairS simplifications = philosophyBot1_allSimplifications_gen(engine); for (PairS p : simplifications) if (allGroupings.contains(p.a)) allGroupings.add(p.b); for (Pair p : engine.matchFacts2("the answer to $x is $y")) { S fact = p.a; SS map = p.b; if (allGroupings.contains($x(map))) { printAfterNewLine("ANSWER>> " + $x(map) + ": " + $y(map)); //print("Trail: " + engine.getTrail(fact)); //print("Question trail: " + engine.getTrail($x(map))); Set set = engine.thingsUsedForMaking(fact); Set strings = asCISet(stringsOnly(set)); Set sourceRules = setIntersection(set, initialRules); Set usedRules = setIntersection(strings, rulesToUse); strings = setMinusSet(strings, usedRules); Set usedGroupings = setIntersection(strings, allOriginalGroupings); Set remainingStrings = setMinusSet(strings, allGroupings); Set usedPatterns = joinCISets(map(usedGroupings, s -> groupingToUsedPatterns.get(s))); LS usedRules_prettier = map(usedRules, s -> replacePrefixIC("add simplifier ", "simplifier ", s)); /*for (O o : sourceRules) { print(" RULE >> " + o); print(" Trail: " + engine.getTrail(o)); } for (O o : usedRules) { print(" FACT >> " + o); print(" Trail: " + engine.getTrail(o)); }*/ pnl(" PATTERN >> ", usedPatterns); pnl(" GROUPED INPUT >> ", usedGroupings); pnl(" TOOL >> ", usedRules_prettier); _answers.put($x(map), $y(map)); } } answers.put(variant, _answers); change(); print(); } } visual northCenterAndSouthWithMargins( jCenteredSection("Input", dm_centeredTextField input()), super, jCenteredSection("Answers", //dm_calculatedTextArea(() -> pnlToString(answers))) dm_calculatedCenteredLabel(() -> joinWithSlash( map(values(answers), map -> joinWithComma(values(map))))) )); start { dm_registerAs winogradSolver(); } // API O getTrailForFact(S fact) { ret engine == null ? null : engine.getTrail(fact); } }