!7 sbool printWebs; sS theRiddle = [[ What is Fibonacci number 0? What is Fibonacci number 1? What is Fibonacci number 2? What is Fibonacci number 3? ]]; sS theFacts = [[ Fibonacci number n is Fibonacci number n-1 plus Fibonacci number n-2 if n > 2. There is no Fibonacci number with a negative index. There is no Fibonacci number 0. Fibonacci number 1 is 1. Fibonacci number 2 is 1. gmtzfidalveipfyx feyhbrhdeovmbvaw amcmxkgwhivbouqs pqnfhkzxoqkaoyqk sppxbuuqeetjmzuo ]]; static L priorityConcepts = ll( "feyhbrhdeovmbvaw", // There is no X. "mtsrzasaoxrmicch", // "X is Y if Z." "fgvvrzypbkqomktd", // X is Y. "sppxbuuqeetjmzuo", // X plus Y "devwldetfsfylnod", // X with a negative index "rgsamtbrhpcqowko", // Fibonacci number X "jxcubqjtqykhfvyo", // X - Y ); !include #1007689 // Web v2 static L facts; p-tt { setFrameHeight(consoleFrame(), 400); centerConsole(); substance(); aiEnhancements(); aiConcepts_noAutoClear(); //useConceptsDump(concepts); set englishToConceptLanguage_useBrackets; facts = clParse(printNumberedLines(linesToCL(theFacts))); useFacts(theFacts); printNumberedLines(facts); print(); for (S rid : toLinesFullTrim(theRiddle)) { print("? " + rid); print(" " + answer(rid)); } aiUsing_print(); makeBot(); } static S answer(S rid) { Lisp riddle = clParse(englishToConceptLanguage(rid)); //print("# " + riddle); if (!riddle.is("urfkhwfasdaqqqse", "mrhggsmuykeceghd")) continue; // What is X? // What is the decimal representation of X? Lisp mainConcept = riddle.get(0); // Make web new Web web; web.node(mainConcept); web.relations(facts); for i to 2: { web_expandMarkers(web); web_expandOperations(web); for (Lisp rule : trueStatementsByHead("mtsrzasaoxrmicch")) { Lisp x = rule.get(0); for (WebNode node : cloneList(web.nodes)) { for (Lisp lbl : cloneList(node.labels)) { //print("Matching " + x + " and " + lbl); Map matches = lispMatch(x, lbl, ll("n")); if (matches != null) { //print("Rule match: " + struct(matches)); Lisp bla = lispReplaceVars(rule.get(2), matches); if (checkACondition(bla)) { bla = lispReplaceVars(rule.get(1), matches); bla = lispCalculateDeep(bla); bla = web_insertNumbers(web, bla); //print("bla: " + bla); bla = lispCalculateDeep(bla); if (lispIsInt(bla)) node.addLabel(bla); // Found! else { print("Condition OK! Evaluating: " + bla); web.node(bla); } } } } } //print("Node: " + node + ", condition: " + condition); } } // Answer question L l = listWithout(web.findNode(mainConcept).labels, mainConcept); //print("Labels: " + l); S s = chooseALabelToReturn(l); s = or2(conceptLanguageToEnglish(unquote(s)), "I don't know"); if (printWebs) print(web); ret s; } sS chooseALabelToReturn(L ll) { L l = map(f clUnparse, ll); //print(" Labels: " + l); S s = findInteger(l); if (s == null) s = firstGlobalID(l); //if (s == null) s = random(l); if (s == null) ret s = first(l); ret s; } static L aiConceptsPrioritized() { new L l; for (S id : priorityConcepts) { AIConcept c = getAIConcept(id); if (c == null) print("Warning: Not found " + id); addIfNotNull(l, c); } Set index = new HashSet(priorityConcepts); for (AIConcept c : aiConceptsByAge()) if (!index.contains(c.globalID)) l.add(c); ret l; } sbool checkACondition(Lisp l) false on exception { //print("Checking: " + l); if (l.is("wdbphzfoxwlrhdyl")) // X > Y ret calculate(l.get(0)).compareTo(calculate(l.get(1))) > 0; print("Ignoring unknown condition " + l); false; } static BigInteger calculate(Lisp l) { l = lispCalculateDeep(l); if (lispIsInt(l)) ret bigint(l.head); fail("Not an int: " + l); }