!747 !multi-line strings m { static L sentences = toLinesFullTrim([[ "0" is a digit. "1" is a digit. "2" is a digit. "3" is a digit. "4" is a digit. "5" is a digit. "6" is a digit. "7" is a digit. "8" is a digit. "9" is a digit. These are all the digits that exist. A number is a concatenation of digits. ]]); static L questions = toLinesFullTrim([[ Is "5" a digit? Is "your mama" a digit? ]]); static class Concept { new L stringExamples; new L descriptions; boolean closed; void addStringExample(S s) { if (!stringExamples.contains(s)) // yes it's inefficient... who cares right now :)))))) stringExamples.add(s); } void addDescription(S s) { if (!descriptions.contains(s)) descriptions.add(s); } } static class Concepts { new Map map; Concept get(S s) { Concept c = map.get(s); if (c == null) map.put(s, c = new Concept()); return c; } } static new Concepts concepts; p { for (S s : concatLists(sentences, questions)) { L tok = javaTok(s); S[] bla = match("* is a *.", tok); if (bla != null && bla[0].startsWith("\"")) { print(bla[0] + " is a " + bla[1] + "!"); concepts.get(bla[1]).addStringExample(unquote(bla[0])); continue; } bla = match("These are all the * that exist.", tok); if (bla != null) { S c = bla[0].replaceAll("s$", ""); concepts.get(c).closed = true; print("Closed concept " + c + "."); continue; } bla = match("A * is ... .", tok); if (bla != null) { S desc = joinRest(bla, 1); concepts.get(bla[0]).addDescription(desc); print(bla[0] + ": " + desc); continue; } // process questions on knowledge base bla = match("Is * a *?", tok); if (bla != null) { print("? " + s); S answer = "Dunno."; Concept c = concepts.get(bla[1]); if (bla[0].startsWith("\"") && c.closed) { answer = c.stringExamples.contains(unquote(bla[0])) ? "Yes." : "No."; } print("! " + answer); continue; } print("Unknown line: " + s); } print("Number of concepts: " + concepts.map.size() + " (" + structure(concepts.map.keySet()) + ")"); } static S joinRest(S[] bla, int i) { return join(" ", Arrays.asList(bla).subList(i, bla.length)); } static S[] match(S pat, L tok) { new Matches m; return match3(pat, join(tok), m) ? m.m : null; } }