!7 sS inputDiagrams = [[ CirclesAndLines(circles=[Circle(text="A [Anything]", x=d("0.32"), y=d("0.55")), Circle(text="B [Anything]", x=d("0.68"), y=d("0.55"))], lines=[Arrow(a=t5, b=t26, text="is"), Arrow(a=t26, b=t5, text="then: is?")], title="A B B A") CirclesAndLines(circles=[Circle(quickvis="Philosophy", text="Philosophy", x=d("0.27"), y=d("0.47")), Circle(quickvis="Asking questions", text="Asking questions", x=d("0.75"), y=d("0.47"))], lines=[Arrow(a=t5, b=t30, text="is")], title="Philosophy") ]]; p-subst { cal_lineLength(50); L webs = websFromCALStructures_vis(inputDiagrams); Web web = first(webs); // Instruction Web patternWeb, Map patternMap = unpair cloneWebWithMap(web); web_dropRelationsStartingWith(patternWeb, "Then:"); Web thenWeb, Map thenMap = unpair cloneWebWithMap(web); web_unpackRelationsStartingWith(thenWeb, "Then:"); Web inputWeb = last(webs); Map match = web_matchAllPerms(patternWeb, inputWeb); // Clone inputWeb to get resultWeb Web resultWeb, Map resultMap = unpair cloneWebWithMap(inputWeb); if (match != null) { // Then add relations from thenWeb for (WebRelation rel : web_relationObjects(thenWeb)) { WebNode a = mapGet(resultMap, mapGet(match, mapGet(patternMap, reverseLookup(thenMap, rel.a))); WebNode b = mapGet(resultMap, mapGet(match, mapGet(patternMap, reverseLookup(thenMap, rel.b))); if (a != null && b != null) { print("Adding labels " + rel.labels + " to: " + a + " - " + b); WebRelation rel2 = resultWeb.getRelation(a, b); web_addLabelsFromNodeToNode(rel, rel2); } } } WebRelation rel = web_findDoubleRelation(resultWeb, "Is", "Is?"); S answer = "?"; if (rel != null) { S a = web_text(rel.a), b = web_text(rel.b); answer = a + " may be " + b + ".\nBut is " + b + " " + a + "?"; } setFrameWidth(700, showTabbedWebs( "Instruction", web, "If", patternWeb, "Then", thenWeb, "Input", inputWeb, "Result", resultWeb != null ? resultWeb : jlabel("Sorry"), "Answer", second(jFullCenterTextPane(answer)))); }