!7 sS theFacts = [[ Gunnar number n is n plus 777 if n > 1. There is no Gunnar number with a negative index. There is no Gunnar number 0. Gunnar number 1 is 50. // Some technical stuff gmtzfidalveipfyx feyhbrhdeovmbvaw amcmxkgwhivbouqs pqnfhkzxoqkaoyqk sppxbuuqeetjmzuo ]]; sS theRiddle = [[ What is Gunnar number 0? What is Gunnar number 1? What is Gunnar number 2? What is Gunnar number 3? What is Gunnar number 4? ]]; static S concepts = [[ ["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", "Gunnar number X"], ["jxcubqjtqykhfvyo", "X - Y", "as in minus"], ["wdbphzfoxwlrhdyl", "X > Y"], ["urfkhwfasdaqqqse", "What is X?"], ["pqnfhkzxoqkaoyqk", "Operation X should be expanded."], ["amcmxkgwhivbouqs", "Something that doesn't exist"], ["yissyloatogavyuu", "Gunnar number"], ["gmtzfidalveipfyx", "Marker X implies label Y."] ]]; !include #1007689 // Web v2 static int saveInterval = 60000; static new Web web; static L facts; static long lastSave, sizeSaved; p-tt { setConsoleTitle(programTitle()); load("web"); lastSave = sysNow(); setFrameHeight(consoleFrame(), 400); centerConsole(); //magellan(); //graphite(); //mistAqua(); //moderateTheme(); sahara(); swing { setConsoleInput("What is Gunnar number 500?"); consoleAddAskButton(); focusConsole(); final JLabel lblBrainSize = jRightAlignedLabel(); addToConsole(lblBrainSize); awtEvery(lblBrainSize, 1000, r { lblBrainSize.setText("Brain Size: " + toM(fileSize(programFile("web.structure")), 1) + "MB"); }); } aiEnhancements(); aiConcepts_noAutoClear(); useConceptsDump(concepts); set englishToConceptLanguage_useBrackets; facts = clParse(linesToCL(theFacts)); print(theFacts); useFacts(theFacts); //printNumberedLines(facts); print(); for (S rid : toLinesFullTrim(theRiddle)) { print("? " + rid); print(" " + answer(rid)); } makeBot(); notDone(); } static S answer(S rid) { if (eq(rid, "web")) { print(web); ret "OK"; } Lisp riddle = clParse(englishToConceptLanguage(rid)); //print("# " + riddle); if (!riddle.is("urfkhwfasdaqqqse", "mrhggsmuykeceghd")) ret "huh?"; // What is X? // What is the decimal representation of X? Lisp mainConcept = riddle.get(0); // Make web web.node(mainConcept); web.relations(facts); int webSize = web.count(); int cursor = 0; while licensed { //print("Web size: " + webSize); if (webSize != sizeSaved && sysNow() >= lastSave+saveInterval) { printWithoutNL("S"); save("web"); sizeSaved = webSize; lastSave = sysNow(); } else printWithoutNL("."); if ((++cursor % 60) == 0) print(); CriticalAction action = beginCriticalAction("Web Update"); try { 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); } } finally { action.done(); } int n = web.count(); if (n == webSize) break; webSize = n; } print(); // print question again if (cursor / 60 >= 10) print("? " + rid); // 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"); 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; } sbool checkACondition(Lisp l) false on exception { ret lispCalculateDeep(l).is("true"); } svoid cleanMeUp { while (criticalActionsInFlight()) sleep(5); if (sizeSaved != web.count()) save("web"); }