// dictionary and connectors have to be ciSets static Chain constructWordFromCISet_withConnectors(S word, Set dictionary, Set connectors) { ifdef constructWordFromCISet_withConnectors_debug print("checking: " + word); endifdef if (contains(dictionary, word)) ret Chain(word); for ping (int i = l(word)-1; i > 0; i--) { S prefix = takeFirst(i, word); if (contains(dictionary, prefix)) { S rest = substring(word, i); // try connector LS matchingConnectors = reversed(prefixesOfIC(connectors, rest)); for (S conn : matchingConnectors) { Chain chain = constructWordFromCISet_withConnectors(dropPrefixIC(conn, rest), dictionary, connectors); if (chain != null) ret Chain(prefix, Chain(conn, chain)); } // try no connector Chain chain = constructWordFromCISet_withConnectors(rest, dictionary, connectors); if (chain != null) ret Chain(prefix, chain); } } null; }