/* Make DCG (experimental) in Picat. This is a port of my make_regex.pi to generate DCGs instead of regexes. Please note that this is quite experimental, contains some hacks and has some limitations (see below). make_dcg(Words) generates a (prefix) DCG for words. It use a simple approach which combines common prefixes in generating the regexp. Some examples: * words = ["a", "al", "all", "alla", "an", "ann", "anna", "annas", "ananas"] regex: a(l(la?)?|n(anas|n(as?)?)?)? DCG : "","a",("";"l",("";"l",("";"a"));"n",("";"n",("";"a",("";"s"));"anas")) * words: ["and", "at", "do", "end", "for", "in", "is", "not", "of", "or", "use"] regex: (a(nd|t)|do|end|for|i[ns]|not|o[fr]|use) DCG : "",("a",("nd";"t");"i",("n";"s");"o",("f";"r");"do";"end";"for";"not";"use") There is a simple way of handling character classes * words: ["price1", "price2", "price3", "price4"] regex: price[1234] DCG : "","p","r","i","c","e",("1";"2";"3";"4") If there is no common prefix then it just put '|' between the words * words: ["this", "is", "a", "very", "boring", "example", "with", "no", "common", "prefix"] regex: (a|boring|common|example|is|no|prefix|this|very|with) DCG : "",("a";"boring";"common";"example";"is";"no";"prefix";"this";"very";"with") Note: There are some kinks in this version: - The logic is from my make_regex programs in Perl/Java/Julia/Python program translated to Picat in make_regex.pi. make_dcg.pi inherits this and adds some more hacks. This should really be rewritten from the start... - Last in make_dcg.pi is a hack which replaces each " " with -> "". The reason is some problem with the Comm string (the return value from the recurive call) - Because of this fix it don't handle spaces. One fix for this is to replace " " in the words with "_". - Unfortunately, the generated DCGs are not directly applicable as DCG since they are really a list of the individual characters used instead of atoms. However, the printed DCG can be used as expected. A workaround is to write the DCG to a file (Picat program): dcg_temp( DCG). and then read this program with cl/1. This is done in test_dcg/1: test_dcg(DCG,Words) = Generated The strings given by the DCG can be generated using dcg_generate/1-2 (defined in dcg_utils.pi) which use bp.expand_term, bp.assert/1 and bp.retract/1. Here is an example from https://stackoverflow.com/questions/41127461/how-do-i-assert-a-dcg-rule-in-prolog Testing the DCG ("all",("","a")) (i,e, the words "all" and "alla": Picat> bp.expand_term($('-->'(test3,("all",("";"a")))),Clause), bp.assert(Clause) Clause = ':-'(test3(_10e50,_10ea0),(_10e50 = [a|_10ef0],_10ef0 = [l|_10f18],_10f18 = [l|_10f40],(_10ea0 = _10f40;_10f40 = [a|_10ea0]))) Picat> bp.test3(X,[]) X = [a,l,l] ?; X = [a,l,l,a] yes See make_regex.pi for creating (prefix) regexps. Also, see the (very old) page for my Perl package MakeRegex (written in 1997): http://hakank.org/makeregex/index.html The README file in that package states: """ The Perl package MakeRegex composes a regex-expression from a list of words. It had been inspired by the emacs elisp module make-regex.el, by Simon Marshall. """ This Picat program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. import dcg_utils. main => go. go ?=> % % Test cases of the form: % [Words, Regexp] % Tests = [ ["all","alla"], % A lot of Swedish words ["all", "alla", "alle", "alls", "palle", "palla", "pelle", "perkele", "ann", "anna", "annas", "anders", "håkan", "ångest", "ärlig", "solsken", "sture", "stina", "hörapparat", "hörsel", "hårig"], ["alla", "palla", "balla", "kalla", "all", "pall", "ball", "kall"], % "ananas" is the Swedish word for pineapple ["a", "al", "all", "alla", "an", "ann", "anna", "annas", "ananas"], ["a", "an", "ann", "anna", "annan", "annas", "annans", "ananas", "ananasens"], ["a", "ab", "abc", "abcd", "abcde", "abcdef", "b", "bc", "bcd", "bcde", "bcdef", "bcdefg", "abb", "abbc", "abbcc", "abbccdd"], ["this", "is", "a", "very", "boring", "example", "with", "no", "common", "prefix"], ["price1","price2","price3","price4"], % This is from Marshall's make-regex.el ["and", "at", "do", "end", "for", "in", "is", "not", "of", "or", "use"], % This is from Marshall's make-regex.el ["cond", "if", "while", "let*?", "prog1", "prog2", "progn", "catch", "throw", "save-restriction", "save-excursion", "save-window-excursion", "save-match-data", "unwind-protect", "condition-case", "track-mouse"], % This is from Marshall's make-regex.el ["abort", "abs", "accept", "access", "array", "begin", "body", "case", "constant", "declare", "delay", "delta", "digits", "else", "elsif", "entry", "exception", "exit", "function", "generic", "goto", "if", "others", "limited", "loop", "mod", "new", "null", "out", "subtype", "package", "pragma", "private", "procedure", "raise", "range", "record", "rem", "renames", "return", "reverse", "select", "separate", "task", "terminate", "then", "type", "when", "while", "with", "xor"], % This is from https://stackoverflow.com/questions/5365283/regular-expression-to-search-for-gadaffi ["Gadaffi","Gadafi","Gadafy","Gaddafi","Gaddafy","Gaddhafi","Gadhafi","Gathafi","Ghadaffi","Ghadafi","Ghaddafi", "Ghaddafy","Gheddafi","Kadaffi","Kadafi","Kaddafi","Kadhafi","Kazzafi","Khadaffy","Khadafy","Khaddafi","Qadafi", "Qaddafi","Qadhafi","Qadhdhafi","Qadthafi","Qathafi","Quathafi","Qudhafi","Kad'afi]"], % Generated in dcg_utils_test.pi (go15/0) from the DCG % (("K";"G";"Q"),("";"h"),"ad",("";"d"),("";"h"),"a",("";"f"),"fi") % translated from the regexp KGQ]h?add?h?af?fi % See https://stackoverflow.com/questions/5365283/regular-expression-to-search-for-gadaffi % Note: The generated DCG is much larger which clearly shows the limitation of a prefix based DCG generator... ["Kadafi","Kadaffi","Kadhafi","Kadhaffi","Kaddafi","Kaddaffi","Kaddhafi","Kaddhaffi","Khadafi","Khadaffi","Khadhafi","Khadhaffi","Khaddafi","Khaddaffi","Khaddhafi","Khaddhaffi","Gadafi","Gadaffi","Gadhafi","Gadhaffi","Gaddafi","Gaddaffi","Gaddhafi","Gaddhaffi","Ghadafi","Ghadaffi","Ghadhafi","Ghadhaffi","Ghaddafi","Ghaddaffi","Ghaddhafi","Ghaddhaffi","Qadafi","Qadaffi","Qadhafi","Qadhaffi","Qaddafi","Qaddaffi","Qaddhafi","Qaddhaffi","Qhadafi","Qhadaffi","Qhadhafi","Qhadhaffi","Qhaddafi","Qhaddaffi","Qhaddhafi","Qhaddhaffi"], % See dcg_test6.pi ["compatible","comprehensible","compressible"], % From https://stackoverflow.com/questions/7432830/generating-the-shortest-regex-to-match-an-arbitrary-word-list ["1231","1233","1234","1236","1238","1247","1256","1258","1259"], % See regex_match_number.pi ["one","two","three","four","five","six","seven","eight","nine"], % https://code.golf/css-colors#prolog ["IndianRed", "LightCoral", "Salmon", "DarkSalmon", "LightSalmon", "Red", "Crimson", "FireBrick", "DarkRed", "Pink", "LightPink", "HotPink", "DeepPink", "MediumVioletRed", "PaleVioletRed", "Coral", "Tomato", "OrangeRed", "DarkOrange", "Orange", "Gold", "Yellow", "LightYellow", "LemonChiffon", "LightGoldenRodYellow", "PapayaWhip", "Moccasin", "PeachPuff", "PaleGoldenRod", "Khaki", "DarkKhaki", "Lavender", "Thistle", "Plum", "Violet", "Orchid", "Fuchsia", "Magenta", "MediumOrchid", "MediumPurple", "BlueViolet", "DarkViolet", "DarkOrchid", "DarkMagenta", "Purple", "Indigo", "DarkSlateBlue", "SlateBlue", "MediumSlateBlue", "RebeccaPurple", "GreenYellow", "Chartreuse", "LawnGreen", "Lime", "LimeGreen", "PaleGreen", "LightGreen", "SpringGreen", "MediumSpringGreen", "MediumSeaGreen", "SeaGreen", "ForestGreen", "Green", "DarkGreen", "YellowGreen", "OliveDrab", "Olive", "DarkOliveGreen", "MediumAquamarine", "DarkSeaGreen", "LightSeaGreen", "DarkCyan", "Teal", "Aqua", "Cyan", "LightCyan", "PaleTurquoise", "Aquamarine", "Turquoise", "MediumTurquoise", "DarkTurquoise", "CadetBlue", "SteelBlue", "LightSteelBlue", "PowderBlue", "LightBlue", "SkyBlue", "LightSkyBlue", "DeepSkyBlue", "DodgerBlue", "CornflowerBlue", "RoyalBlue", "Blue", "MediumBlue", "DarkBlue", "Navy", "MidnightBlue", "Cornsilk", "BlanchedAlmond", "Bisque", "NavajoWhite", "Wheat", "Burlywood", "Tan", "RosyBrown", "SandyBrown", "GoldenRod", "DarkGoldenRod", "Peru", "Chocolate", "SaddleBrown", "Sienna", "Brown", "Maroon", "White", "Snow", "Honeydew", "MintCream", "Azure", "AliceBlue", "GhostWhite", "WhiteSmoke", "SeaShell", "Beige", "OldLace", "FloralWhite", "Ivory", "AntiqueWhite", "Linen", "LavenderBlush", "MistyRose", "Gainsboro", "LightGray", "LightGrey", "Silver", "DarkGray", "DarkGrey", "Gray", "Grey", "DimGray", "DimGrey", "LightSlateGray", "LightSlateGrey", "SlateGray", "SlateGrey", "DarkSlateGray", "DarkSlateGrey", "Black"] ], foreach(T in Tests) println(words=T), println(num_words=T.len), % Note: the generated DCG is not the nice string ("","all",("";"a"))) % but a much uglier variant: ['"','"',',','"',a,'"',',','"',l,'"',',','"',l,'"',',','(','"','"',';','"',a,'"',')'] DCG = make_dcg(T), println(DCG), % We can get around this ugliness by writing it to file as a Picat term % dcg_tmp( DCG ). % and then read it again with cl/1. % This is done in test_dcg/1. % println("Generating from DCG:"), Generated = test_dcg(DCG,T), println(Generated), compare_with_wordlist(T,Generated), nl,nl end, nl. go => true. % % Test some random words. % - get some random words % - generate a DCG % - generate the strings from the DCG % go2 ?=> garbage_collect(300_000_000), _ = random2(), NumWords = 120, % AllWords = read_file_lines("unixdict.txt"), AllWords = read_file_lines("/usr/share/dict/words"), % AllWords = [W : W in read_file_lines("sv_spelling_org_utf8.txt"), W.len < 6], AllWordsLen = AllWords.len, println(allWordsLen=AllWordsLen), % Pick about NumWords words Words = [AllWords[R] : _ in 1..NumWords, R = random(1,AllWordsLen)].remove_dups, println(num_random_words=Words.len), println(words=Words), WordsString = join(Words,''), DCG = make_dcg(Words), println(dcg=DCG), println(words_string_len=WordsString.len), println(dcg_len=DCG.len), println("Generated:"), test_dcg(DCG,Words) = Generated, compare_with_wordlist(Words,Generated), nl. go2 => true. % % Generate a DCG for all the words in a wordlist. % % go3 ?=> garbage_collect(300_000_000), % wordsLen is the quoted words joined by ";" for checking the compression of the DCG Words = read_file_lines("unixdict.txt"), % 25104 words. 1.361s wordsLen = 256610 dcg_len = 226243 % Words = read_file_lines("/usr/share/dict/words"), % 102305 words. 32.564s wordsLen = 1175913 dcg_len = 979125 % Words = read_file_lines("words_lower.txt"), % 415834 % Words = read_file_lines("sv_spelling_org_utf8.txt"), % 391085 (Swedish) words. ? % Words = read_file_lines("wordle_small.txt"), % numWords = 2315 wordsLen = 18519 dcg_len = 17208 % Pick words of a certain length % Words := [W.to_lowercase : W in Words, W.len == 3,not membchk('\'',W),not membchk(' ',W)], % print(words=Words), WordsString = join([ "\"" ++ W ++ "\"" : W in Words],';'), % println(wordsString=WordsString), WordsLen = Words.len, println(wordsLen=WordsLen), DCG = make_dcg(Words), println(DCG), println(numWords = Words.len), println(wordsLen=WordsString.len), println(dcg_len=DCG.len), println("Generate words given by this DCG."), test_dcg(DCG,Words) = Generated, compare_with_wordlist(Words,Generated), nl. go3 => true. % Some tests with some of the generated DCGs go4 ?=> All = findall(S,test1(S,[])), println(all=All), println(len=All.len), nl. go4 => true. % % Wordle words (2315). Checking and generating. % Generates all words but they are not the same order % (which I wouldn't expect). % go5 ?=> File = "wordle_small.txt", WordleWords = read_file_lines(File), println(numWords=WordleWords.len), Failed = [], foreach(Word in WordleWords) if wordle_words(Word,[]) then % println(Word=ok) true else println(word_not_ok), Failed := Failed ++ [Word] end end, println(failed=Failed), % Generate the words Gen = findall(S,wordle_words(S,[])), % println(gen=Gen), println(len=Gen.len), if WordleWords == Gen then println("Same order!") else if WordleWords.sort == Gen.sort then println("Same after sort") else println("Not same after sort!") end end, nl. go5 => true. % % Show/investigate the generated Prolog predicates. % This use the generate_dcg/1-2 from dcg_utils.pi % go6 ?=> DCGs = [ ("","a","l","l",("";"a")), ([all],([];[a])), % "atom" version ("",("a",("l","l",("";"a";"e";"s");"n",("n",("";"a",("";"s"));"ders"));"h",("å",("kan";"rig");"ö","r",("apparat";"sel"));"p",("a","l","l",("a";"e");"e",("lle";"rkele"));"s",("t",("ina";"ure");"olsken");"ärlig";"ångest")), ("",("a","l","l",("";"a");"b","a","l","l",("";"a");"k","a","l","l",("";"a");"p","a","l","l",("";"a"))), ("","a",("";"l",("";"l",("";"a"));"n",("";"n",("";"a",("";"s"));"anas"))), ("","a",("";"n",("";"a","n","a","s",("";"ens");"n",("";"a",("";"n",("";"s");"s"))))), ("",("a",("";"b",("";"b",("";"c",("";"c",("";"dd")));"c",("";"d",("";"e",("";"f")))));"b",("";"c",("";"d",("";"e",("";"f",("";"g"))))))), ("",("a";"boring";"common";"example";"is";"no";"prefix";"this";"very";"with")), ("","p","r","i","c","e",("1";"2";"3";"4")), ("",("a",("nd";"t");"i",("n";"s");"o",("f";"r");"do";"end";"for";"not";"use")), ("",("c",("o","n","d",("";"ition-case");"atch");"p","r","o","g",("1";"2";"n");"s","a","v","e","-",("excursion";"match-data";"restriction";"window-excursion");"t",("hrow";"rack-mouse");"if";"let*?";"unwind-protect";"while")), ("",("a",("b",("ort";"s");"c","c","e",("pt";"ss");"rray");"b",("egin";"ody");"c",("ase";"onstant");"d",("e",("l",("ay";"ta");"clare");"igits");"e",("l","s",("e";"if");"x",("ception";"it");"ntry");"g",("eneric";"oto");"l",("imited";"oop");"n",("ew";"ull");"o",("thers";"ut");"p",("r",("agma";"ivate";"ocedure");"ackage");"r",("a",("ise";"nge");"e",("cord";"m";"names";"turn";"verse"));"s",("e",("lect";"parate");"ubtype");"t",("ask";"erminate";"hen";"ype");"w",("h",("en";"ile");"ith");"function";"if";"mod";"xor")), ("",("b",("abysat";"luet";"uchanan");"c",("ape";"hinatown");"h",("ertz";"ookup");"p",("adre";"ersuasive");"s",("pinster";"tandby");"aster";"degeneracy";"emboss";"followeth";"gedanken";"incompetent";"noah";"tv";"uppercut")), ("cosponsor" ;("e",("lectron" ; "nd")) ;"hampshire";"ketchup";("s",("arcophagusclerosis" ; "everalty") ); "voluntary";"worthington"), ([go,to], [write], [stop]), % Note: Must $ quote DCGs with Prolog/Picat terms to use it with bp.expand_term. % Also, it must be B-Prolog predicates, not Picat's $([go,to], [C], {writeln('hello, world!'),C=wrote_hello_world}, [stop]), ("G",("a",("d",("a","f",("fi";"i";"y");"d",("a","f",("i";"y");"hafi");"hafi");"thafi");"h",("a","d",("a","f",("fi";"i");"d","a","f",("i";"y"));"eddafi"));"K",("a",("d",("a","f",("fi";"i");"'afi]";"dafi";"hafi");"zzafi");"h","a","d",("a","f",("fy";"y");"dafi"));"Q",("a",("d",("h",("afi";"dhafi");"afi";"dafi";"thafi");"thafi");"u",("athafi";"dhafi"))), % Generated by make_dcg(["1231","1233","1234","1236","1238","1247","1256","1258","1259"]) in go/0 % and it seems to be OK ("1","2",("3",("1";"3";"4";"6";"8");"5",("6";"8";"9");"47")) ], foreach(DCG in DCGs) println(dcg=DCG), PrintClause = true, All = dcg_generate(DCG,PrintClause), println(all=All), println(num_words=All.len), nl end, nl. go6 => true. % % The "DCG" generated by make_dcg/1 is not a DCG but an "ugly" version of it. % test_dcg/1 fixes this by writing the DCG to a Picat file, e.g. % % dcg_tmp( ("","1","2",("3",("1";"3";"4";"6";"8");"5",("6";"8";"9");"47"))). % % which is then read by cl/1 and evaluated. % test_dcg(DCG,Words) = Generated => TmpFile = "make_dcg_temp.pi", Writer = open(TmpFile,write), println(Writer,"dcg_tmp( (" ++ DCG ++ ")).\n"), close(Writer), cl(TmpFile), dcg_tmp(DCGGen), Generated = dcg_generate(DCGGen,false). compare_with_wordlist(Words,Generated) => println("Compare with the given words:"), if Words == Generated then println("The same!") else if Words.sort == Generated.sort then println("The same after sort") else println("Not the same after sort!") end end, nl. % % Tested in go4/0 % test1 --> % [["all","alla"], "alla?"] % "all", ("" ; "a"). % [["alla", "palla", "balla", "kalla", "all", "pall", "ball", "kall"], % "(alla?|balla?|kalla?|palla?)" % ("all", ("" ; "a")) ; ("ball", (""; "a")) ; ("kall", ("","a")) ; ("pall", ("" ; "a")). %% "ananas" is the Swedish word for pineapple % [["a", "al", "all", "alla", "an", "ann", "anna", "annas", "ananas"], % "a(l(la?)? | n(anas|n(as?)?)?)?"], %% "a", ((("l",("" ; "l", ("";"a"))) ; ("n", ("" ; ("anas";"n",("a",("";"s");""))))) ; ""). % [["price1","price2","price3","price4"],"price[1234]"] % "price",("1" ; "2" ; "3" ; "4"). % This is from Marshall's make-regex.el % [["and", "at", "do", "end", "for", "in", "is", "not", "of", "or", "use"], % "(a(nd|t)|do|end|for|i[ns]|not|o[fr]|use)" % ("a", (("nd") ; "t") ; "do" ; "end" ; "for" ; ("i", ("n" ; "s")) ; "not" ; ("o", ("f" ; "r")) ; "use"). % [voluntary,electron,sclerosis,severalty,ketchup,cosponsor,worthington,hampshire,end,sarcophagus] % (cosponsor|e(lectron|nd)|hampshire|ketchup|s(arcophagus|clerosis|everalty)|voluntary|worthington) % ("cosponsor" ; % ("e",("lectron" ; "nd")) ; % "hampshire"; % "ketchup"; % ("s",("arcophagusclerosis" ; "everalty") ); % "voluntary"; % "worthington"). % Generated by make_dcg/1 and it works!!! % "","a",("";"l",("";"l",("";"a"));"n",("";"n",("";"a",("";"s"));"anas")). % "","a",("";"n",("";"a","n","a","s",("";"ens");"n",("";"a",("";"n",("";"s");"s")))). % "",("a",("nd";"t");"i",("n";"s");"o",("f";"r");"do";"end";"for";"not";"use"). % "",("a",("l","l",("";"a";"e";"s");"n",("n",("";"a",("";"s"));"ders"));"h",("å",("kan";"rig");"ö","r",("apparat";"sel"));"p",("a","l","l",("a";"e");"e",("lle";"rkele"));"s",("t",("ina";"ure");"olsken");"ärlig";"ångest"). % "",("a",("";"b",("";"b",("";"c",("";"c",("";"dd")));"c",("";"d",("";"e",("";"f")))));"b",("";"c",("";"d",("";"e",("";"f",("";"g")))))). %"",("c",("o","n","d",("";"ition-case");"atch");"p","r","o","g",("1";"2";"n");"s","a","v","e","-",("excursion";"match-data";"restriction";"window-excursion");"t",("hrow";"rack-mouse");"if";"let*?";"unwind-protect";"while"). %"",("a",("b",("ort";"s");"c","c","e",("pt";"ss");"rray");"b",("egin";"ody");"c",("ase";"onstant");"d",("e",("l",("ay";"ta");"clare");"igits");"e",("l","s",("e";"if");"x",("ception";"it");"ntry");"g",("eneric";"oto");"l",("imited";"oop");"n",("ew";"ull");"o",("thers";"ut");"p",("r",("agma";"ivate";"ocedure");"ackage");"r",("a",("ise";"nge");"e",("cord";"m";"names";"turn";"verse"));"s",("e",("lect";"parate");"ubtype");"t",("ask";"erminate";"hen";"ype");"w",("h",("en";"ile");"ith");"function";"if";"mod";"xor"). "",("b",("abysat";"luet";"uchanan");"c",("ape";"hinatown");"h",("ertz";"ookup");"p",("adre";"ersuasive");"s",("pinster";"tandby");"aster";"degeneracy";"emboss";"followeth";"gedanken";"incompetent";"noah";"tv";"uppercut"). % Testing 'traditional' DCGs. This works. % ([go,to], [C], {println('hello, world!'),C=wrote_hello_world}, [stop]). % % The main procedure: % make_dcg(Words) = DCG % make_dcg(Words) = common_prefix("", sort(Words)). % % common_prefix(p, list) % % Here is where the main work is done. It's somewhat magically ported from my % Perl/Java/Python versions... % common_prefix(P, List) = Ret => % println(common_prefix=P), ListLen = List.len, Ret1 = _, if ListLen == 0 then Ret1 := "" % , println(ret1=Ret1) end, if var(Ret1), ListLen == 1 then Ret1 := ([P] ++ join(List,'')).flatten % , println(ret2=Ret1) end, % % fix for some - as of now - unknown bug. To fix in later version! % if var(Ret1), P == "", List[1] == "", List[2] == "" then Ret1 := "" % , println(ret3=Ret1) end, if var(Ret1) then % Collect all the strings with the same prefix-char Hash = new_map(), foreach(Word in List.sort()) Prefix = "", SuffixedWord = "", if Word.len > 0 then Prefix := Word[1], SuffixedWord := [Word[I] : I in 2..Word.len] % Word[2..Word.len], end, % Put the suffix in the list of other suffixes for % this prefix Hash.put(Prefix, Hash.get(Prefix,"") ++ [SuffixedWord]) end, % And recurse this list All = [], foreach(Key in Hash.keys().sort()) Comm = "", Values = Hash.get(Key), if Key.len > 0, Values != [] then Values := sort(Values), Comm := common_prefix(Key, Values) end, % println(comm_after_recurse=Comm), if Comm == "" then % println(we_got_start_comm), Comm := " " % THIS GIVE SOME PROBLEM in the foreach (W in all). Fixed with " " -> "" in last Ret1 % Comm := '"' % Ah, this works! Nope! end, % writeln(comm=Comm), % if atom(Comm) then % println(comm_atom=Comm) % else % println(comm_not_atom=Comm) % end, All := All ++ [Comm] end, % println(all=All), All := sort(All), % println(sorted_All=All), % paren: what to put in parenthesis ('()' or '[]') if anything Paren = "", AllLen = All.len, if AllLen == 1 then % println(allLen=1), Paren := join(All,'') else Len := max([A.len : A in All]), % JoinChar = cond(Len != 1,";",""), JoinChar = cond(Len != 1,"",""), % println(joinChar=JoinChar), % joins all entries except for " " JoinStr = "", Mark = "", Count = 0, % println(all=All), foreach(W in All, W != ' ') % println(w=W), % if atom(W) then % writeln(atom=W) % end, if string(W) then if W[1] == '\"' then % println(w=quoted) true else W := "\"" ++ W ++ "\"" % , println(w=not_quoted) end end, if W.len > 0, W != " ", W != ' ' then JoinStr := JoinStr ++ W, if Count < AllLen-1 then JoinStr := JoinStr ++ ";" ++ JoinChar end end, Count := Count + 1 end, Paren = "", % println(joinStr=JoinStr), if JoinStr.len == 1 then % println(joinstr_len1=JoinStr), Paren := "(" ++ JoinStr ++ ";" ++ Mark ++ ")" else % println(mark=Mark), if Len == 1 then Paren := "(" ++ JoinStr ++ ")" ++ Mark else Paren := "(" ++ JoinStr ++ ")" ++ Mark end end end, PP = "\"" ++ [P] ++ "\",", Ret1 := (PP ++ Paren).flatten % , println(ret4=Ret1) end, % Ret = Ret1.flatten. Ret = Ret1.flatten.replace_string(" ",""). % THIS IS A HACK for the Comm := " " stuff! % % The DCG for the Wordle target lists. Tested in go5/0. % % And this generates exactly 2315 words! % numWords = 2315 % wordsLen = 18519 % dcg_len = 17208 % % make_regex gives a regex length of 9427 characters % wordle_words --> "",("a",("b",("a",("ck";"se";"te");"b",("ey";"ot");"o",("de";"rt";"ut";"ve");"hor";"ide";"led";"use";"yss");"c",("orn";"rid";"tor";"ute");"d",("a",("ge";"pt");"m","i",("n";"t");"o",("r",("e";"n");"be";"pt");"ept";"ult");"f",("o",("ot";"ul");"fix";"ire";"ter");"g",("a",("in";"pe";"te");"i",("le";"ng");"o",("ny";"ra");"ent";"low";"ree");"i",("der";"sle");"l",("i",("bi";"en";"gn";"ke";"ve");"l",("o",("t";"w";"y");"ay";"ey");"o",("n",("e";"g");"ft";"of";"ud");"t",("ar";"er");"arm";"bum";"ert";"gae";"pha");"m",("a",("ss";"ze");"b",("er";"le");"i",("ss";"ty");"p","l",("e";"y");"end";"ong";"use");"n",("g",("e",("l";"r");"le";"ry";"st");"n",("ex";"oy";"ul");"ime";"kle";"ode";"tic";"vil");"p",("p","l",("e";"y");"art";"hid";"ing";"nea";"ron";"tly");"r",("o",("ma";"se");"r",("ay";"ow");"bor";"dor";"ena";"gue";"ise";"mor";"son";"tsy");"s",("s",("ay";"et");"cot";"hen";"ide";"kew");"t",("o",("ll";"ne");"tic");"u",("d","i",("o";"t");"gur";"nty");"v",("ail";"ert";"ian";"oid");"w",("a",("r",("d";"e");"it";"ke";"sh");"ful";"oke");"x","i",("o",("m";"n");"al");"head";"orta";"zure");"b",("a",("d",("ge";"ly");"g",("el";"gy");"l",("er";"my");"n",("al";"jo");"r",("ge";"on");"s",("i",("c";"l";"n";"s");"al";"te");"t",("ch";"he";"on";"ty");"con";"ker";"wdy";"you");"e",("a",("ch";"dy";"rd";"st");"e",("ch";"fy");"g",("a",("n";"t");"et";"in";"un");"l",("l",("e";"y");"ch";"ie";"ow");"r",("et";"ry";"th");"fit";"ing";"nch";"set";"tel";"vel";"zel");"i",("l",("ge";"ly");"n","g",("e";"o");"r",("ch";"th");"ble";"cep";"ddy";"got";"ome";"son";"tty");"l",("a",("n",("d";"k");"ck";"de";"me";"re";"st";"ze");"e",("a",("k";"t");"e",("d";"p");"nd";"ss");"i",("n",("d";"k");"mp";"ss";"tz");"o",("o",("d";"m");"at";"ck";"ke";"nd";"wn");"u",("r",("b";"t");"er";"ff";"nt";"sh"));"o",("a",("rd";"st");"n",("ey";"go";"us");"o",("t",("h";"y");"z",("e";"y");"by";"st");"r",("ax";"ne");"s",("om";"sy");"u",("gh";"le";"nd");"bby";"tch";"wel";"xer");"r",("a",("i",("d";"n");"s",("h";"s");"v",("e";"o");"w",("l";"n");"ce";"ke";"nd");"e",("a",("d";"k");"ed");"i",("n",("e";"g";"k";"y");"ar";"be";"ck";"de";"ef";"sk");"o",("o",("d";"k";"m");"ad";"il";"ke";"th";"wn");"u",("nt";"sh";"te"));"u",("d",("dy";"ge");"g",("gy";"le");"i","l",("d";"t");"l",("ge";"ky";"ly");"n",("ch";"ny");"r",("ly";"nt";"st");"s",("ed";"hy");"t",("ch";"te");"xom";"yer");"ylaw");"c",("a",("b",("al";"by";"in";"le");"c",("ao";"he";"ti");"d",("dy";"et");"m","e",("l";"o");"n",("o",("e";"n");"al";"dy";"ny");"p",("er";"ut");"r",("at";"go";"ol";"ry";"ve");"t",("ch";"er";"ty");"u",("lk";"se");"gey";"irn";"ste";"vil");"e",("ase";"dar";"llo");"h",("a",("f",("e";"f");"i",("n";"r");"r",("d";"m";"t");"s",("e";"m");"lk";"mp";"nt";"os");"e",("a",("p";"t");"e",("k";"r");"s",("s";"t");"ck");"i",("l",("d";"i";"l");"ck";"de";"ef";"me";"na";"rp");"o",("r",("d";"e");"ck";"ir";"ke";"se");"u",("ck";"mp";"nk";"rn";"te"));"i",("v","i",("c";"l");"der";"gar";"nch";"rca");"l",("a",("n",("g";"k");"s",("h";"p";"s");"ck";"im";"mp");"e",("a",("n";"r";"t");"ft";"rk");"i",("n",("g";"k");"ck";"ff";"mb");"o",("u",("d";"t");"ak";"ck";"ne";"se";"th";"ve";"wn");"u",("ck";"ed";"mp";"ng"));"o",("a",("ch";"st");"l","o",("n";"r");"m",("et";"fy";"ic";"ma");"n",("ch";"do";"ic");"r",("al";"er";"ny");"u",("ch";"gh";"ld";"nt";"pe";"rt");"v","e",("n";"r";"t";"y");"bra";"coa";"pse";"wer";"yly");"r",("a",("n",("e";"k");"s",("h";"s");"z",("e";"y");"ck";"ft";"mp";"te";"ve";"wl");"e",("a",("k";"m");"e",("d";"k";"p");"p",("e";"t");"s",("s";"t");"do";"me");"i",("e",("d";"r");"m",("e";"p");"ck";"sp");"o",("n",("e";"y");"w",("d";"n");"ak";"ck";"ok";"ss";"up");"u",("m",("b";"p");"s",("h";"t");"de";"el");"ypt");"u",("r",("v",("e";"y");"io";"ly";"ry";"se");"bic";"min";"tie");"y",("ber";"cle";"nic"));"d",("a",("i",("ly";"ry";"sy");"n",("ce";"dy");"ddy";"lly";"tum";"unt");"e",("a",("lt";"th");"b",("u",("g";"t");"ar";"it");"c",("a",("l";"y");"o",("r";"y");"ry");"i",("gn";"ty");"l",("ay";"ta";"ve");"m",("on";"ur");"n",("im";"se");"p",("ot";"th");"t",("er";"ox");"fer";"rby";"uce";"vil");"i",("n",("g",("o";"y");"er");"r",("ge";"ty");"t",("t",("o";"y");"ch");"ary";"cey";"git";"lly";"mly";"ode";"sco";"ver";"zzy");"o",("d","g",("e";"y");"n",("or";"ut");"u",("bt";"gh");"w",("dy";"el";"ny";"ry");"gma";"ing";"lly";"pey";"zen");"r",("a",("w",("l";"n");"ft";"in";"ke";"ma";"nk";"pe");"e",("a",("d";"m");"ss");"i",("e",("d";"r");"ft";"ll";"nk";"ve");"o",("o",("l";"p");"it";"ll";"ne";"ss";"ve";"wn");"u",("id";"nk");"y",("er";"ly"));"u",("m",("my";"py");"s",("ky";"ty");"chy";"lly";"nce";"tch";"vet");"w",("e","l",("l";"t");"arf");"ying");"e",("a",("g",("er";"le");"r",("ly";"th");"t","e",("n";"r");"sel");"d","i",("ct";"fy");"l",("e",("ct";"gy");"i",("de";"te");"ate";"bow";"der";"fin";"ope";"ude");"m",("b","e",("d";"r");"ail";"cee";"pty");"n",("e","m",("a";"y");"t",("er";"ry");"act";"dow";"joy";"nui";"sue";"voy");"p","o",("ch";"xy");"q","u",("al";"ip");"r",("ase";"ect";"ode";"ror";"upt");"s",("say";"ter");"t",("h",("er";"ic";"os");"ude");"v",("e",("nt";"ry");"ade";"ict";"oke");"x",("a",("ct";"lt");"i",("le";"st");"t",("ol";"ra");"cel";"ert";"pel";"ult");"bony";"clat";"erie";"gret";"ight";"ject";"king";"ying");"f",("a",("i",("nt";"ry";"th");"n",("cy";"ny");"t",("al";"ty");"u",("lt";"na");"ble";"cet";"lse";"rce";"vor");"e",("l",("la";"on");"m",("me";"ur");"r",("al";"ry");"t",("al";"ch";"id";"us");"ast";"cal";"ign";"nce";"ver";"wer");"i",("b",("er";"re");"e",("ld";"nd";"ry");"f","t",("h";"y");"l",("e",("r";"t");"ly";"my";"th");"n",("al";"ch";"er");"cus";"ght";"rst";"shy";"xer";"zzy");"l",("a",("i",("l";"r");"k",("e";"y");"s",("h";"k");"ck";"me";"nk";"re");"e",("ck";"et";"sh");"i",("n",("g";"t");"ck";"er";"rt");"o",("o",("d";"r");"u",("r";"t");"at";"ck";"ra";"ss";"wn");"u",("n",("g";"k");"ff";"id";"ke";"me";"sh";"te");"yer");"o",("c",("al";"us");"l",("io";"ly");"r",("g",("e";"o");"t",("e";"h";"y");"ay";"ce";"um");"amy";"ggy";"ist";"und";"yer");"r",("a",("il";"me";"nk";"ud");"e",("e",("d";"r");"ak";"sh");"i",("ar";"ed";"ll";"sk";"tz");"o",("n",("d";"t");"ck";"st";"th";"wn";"ze");"uit");"u",("n",("gi";"ky";"ny");"r",("or";"ry");"dge";"gue";"lly";"ssy";"zzy");"jord");"g",("a",("m",("er";"ma";"ut");"u",("dy";"ge";"nt";"ze");"y",("er";"ly");"ffe";"ily";"ssy";"vel";"wky";"zer");"e",("e",("ky";"se");"n",("ie";"re");"cko");"h","o",("st";"ul");"i",("r",("ly";"th");"v","e",("n";"r");"ant";"ddy";"psy");"l",("a",("de";"nd";"re";"ss";"ze");"e","a",("m";"n");"i",("de";"nt");"o",("at";"be";"om";"ry";"ss";"ve");"yph");"n",("ash";"ome");"o",("l",("em";"ly");"n",("ad";"er");"o",("dy";"ey";"fy";"se");"u",("ge";"rd");"dly";"ing";"rge");"r",("a",("i",("l";"n");"n",("d";"t");"p",("e";"h");"s",("p";"s");"v",("e";"y");"ce";"de";"ft";"te";"ze");"e",("e",("d";"n";"t");"at");"i",("m",("e";"y");"ef";"ll";"nd";"pe");"o",("u",("p";"t");"w",("l";"n");"an";"in";"om";"pe";"ss";"ve");"u",("el";"ff";"nt"));"u",("a",("rd";"va");"e","s",("s";"t");"i",("l",("d";"e";"t");"de";"se");"l",("ch";"ly");"m",("bo";"my");"s","t",("o";"y");"ppy");"ypsy");"h",("a",("r",("dy";"em";"py";"ry";"sh");"s","t",("e";"y");"t",("ch";"er");"u",("nt";"te");"v",("en";"oc");"bit";"iry";"lve";"ndy";"ppy";"zel");"e",("a",("r",("d";"t");"v",("e";"y");"dy";"th");"l",("ix";"lo");"dge";"fty";"ist";"nce";"ron");"i",("p","p",("o";"y");"lly";"nge";"tch");"o",("n",("ey";"or");"r",("de";"ny";"se");"t",("el";"ly");"u",("nd";"se");"v","e",("l";"r");"ard";"bby";"ist";"lly";"mer";"wdy");"u",("m",("an";"id";"or";"ph";"us");"n",("ch";"ky");"s",("ky";"sy");"rry";"tch");"y",("dro";"ena";"men";"per"));"i",("c","i",("ly";"ng");"d",("i","o",("m";"t");"eal";"ler";"yll");"m",("p",("el";"ly");"age";"bue");"n",("e",("pt";"rt");"l",("ay";"et");"t",("er";"ro");"ane";"box";"cur";"dex";"fer";"got";"ner";"put");"r",("ate";"ony");"s",("let";"sue");"gloo";"liac";"onic";"tchy";"vory");"j",("a",("unt";"zzy");"e",("lly";"rky";"tty";"wel");"o",("i",("nt";"st");"ker";"lly";"ust");"u",("i","c",("e";"y");"m",("bo";"py");"n","t",("a";"o");"dge";"ror");"iffy");"k",("a",("ppa";"rma";"yak");"i",("nky";"osk";"tty");"n",("a",("ck";"ve");"e",("e",("d";"l");"ad";"lt");"o",("ck";"ll";"wn");"ife");"ebab";"haki";"oala";"rill");"l",("a",("b",("el";"or");"d",("en";"le");"n",("ce";"ky");"p",("el";"se");"r",("ge";"va");"t",("ch";"er";"he";"te");"ger";"sso";"ugh";"yer");"e",("a",("s",("e";"h";"t");"ch";"fy";"ky";"nt";"pt";"rn";"ve");"e",("ch";"ry");"g",("al";"gy");"m",("on";"ur");"v","e",("l";"r");"dge";"fty";"per");"i",("m",("bo";"it");"n",("e",("n";"r");"go");"v",("er";"id");"bel";"ege";"ght";"ken";"lac";"pid";"the");"o",("a",("my";"th");"c",("al";"us");"g","i",("c";"n");"o",("py";"se");"u","s",("e";"y");"w",("er";"ly");"bby";"dge";"fty";"rry";"ser";"ver";"yal");"u",("c",("id";"ky");"m",("en";"py");"n",("ar";"ch";"ge");"r",("ch";"id");"pus";"sty");"y",("ing";"mph";"nch";"ric");"lama");"m",("a",("c",("aw";"ho";"ro");"d",("am";"ly");"g",("ic";"ma");"m",("m",("a";"y");"bo");"n",("g",("a";"e";"o";"y");"i",("a";"c");"ly";"or");"r",("ch";"ry";"sh");"s",("on";"se");"t",("ch";"ey");"y",("be";"or");"fia";"ize";"jor";"ker";"ple";"uve";"xim");"e",("a",("ly";"nt";"ty");"d",("i",("a";"c");"al");"l",("ee";"on");"r",("cy";"ge";"it";"ry");"t",("al";"er";"ro");"cca");"i",("d",("ge";"st");"n",("ce";"er";"im";"or";"ty";"us");"s",("er";"sy");"cro";"ght";"lky";"mic";"rth");"o",("d",("e",("l";"m");"al");"l",("ar";"dy");"n",("ey";"th");"o",("dy";"se");"r",("al";"on";"ph");"t",("el";"if";"or";"to");"u",("n",("d";"t");"lt";"rn";"se";"th");"v",("er";"ie");"cha";"gul";"ist";"ssy";"wer");"u",("c",("ky";"us");"r",("al";"ky");"s",("hy";"ic";"ky";"ty");"ddy";"lch";"mmy";"nch");"yrrh");"n",("a",("s",("al";"ty");"v",("al";"el");"dir";"ive";"nny";"tal");"e",("r",("dy";"ve");"w",("er";"ly");"edy";"igh";"ver");"i",("c",("er";"he");"n",("ja";"ny";"th");"ece";"ght");"o",("b","l",("e";"y");"i","s",("e";"y");"mad";"ose";"rth";"sey";"tch";"vel");"u",("dge";"rse";"tty");"y",("lon";"mph"));"o",("c",("t",("al";"et");"cur";"ean");"d","d",("er";"ly");"f",("f",("al";"er");"ten");"l",("d","e",("n";"r");"ive");"m",("bre";"ega");"n",("ion";"set");"p",("i",("ne";"um");"era";"tic");"r",("bit";"der";"gan");"t",("her";"ter");"u",("t",("do";"er";"go");"ght";"nce");"v",("a",("ry";"te");"ert";"ine";"oid");"w",("ing";"ner");"aken";"bese";"xide";"zone");"p",("a",("l",("er";"sy");"n",("el";"ic";"sy");"p",("al";"er");"r",("er";"ka";"ry";"se";"ty");"s","t",("a";"e";"y");"t",("ch";"io";"sy";"ty");"y","e",("e";"r");"ddy";"gan";"int";"use");"e",("a",("c",("e";"h");"rl");"n",("n",("e";"y");"al";"ce");"r",("ch";"il";"ky");"s",("ky";"to");"t",("al";"ty");"can";"dal");"h",("o",("n",("e";"y");"to");"ase");"i",("e",("ce";"ty");"n",("ch";"ey";"ky";"to");"t",("ch";"hy");"x",("el";"ie");"ano";"cky";"ggy";"lot";"per";"que";"vot";"zza");"l",("a",("i",("d";"n";"t");"n",("e";"k";"t");"ce";"te";"za");"e","a",("d";"t");"i","e",("d";"r");"u",("m",("b";"e";"p");"ck";"nk";"sh"));"o",("i",("nt";"se");"l",("ar";"ka";"yp");"s",("er";"it";"se");"u",("ch";"nd";"ty");"esy";"ker";"och";"ppy";"rch";"wer");"r",("a",("nk";"wn");"e",("en";"ss");"i",("c",("e";"k");"m",("e";"o");"de";"ed";"nt";"or";"sm";"vy";"ze");"o",("n",("e";"g");"be";"of";"se";"ud";"ve";"wl";"xy");"u",("de";"ne"));"u",("l",("py";"se");"p",("al";"il";"py");"r",("e",("e";"r");"ge";"se");"bic";"dgy";"ffy";"nch";"shy";"tty");"salm";"ygmy");"q","u",("a",("r",("k";"t");"s",("h";"i");"ck";"il";"ke";"lm");"e",("e",("n";"r");"ll";"ry";"st";"ue");"i",("l",("l";"t");"ck";"et";"rk";"te");"o","t",("a";"e";"h"));"r",("a",("b",("bi";"id");"d",("i",("i";"o");"ar");"i",("ny";"se");"l",("ly";"ph");"n",("ch";"dy";"ge");"t",("io";"ty");"cer";"jah";"men";"pid";"rer";"spy";"ven";"yon";"zor");"e",("a",("c",("h";"t");"dy";"lm";"rm");"b",("u",("s";"t");"ar";"el");"c",("u",("r";"t");"ap");"f",("er";"it");"l",("a",("x";"y");"ic");"n",("al";"ew");"p",("ay";"el";"ly");"s",("et";"in");"t",("r",("o";"y");"ch");"v",("el";"ue");"edy";"gal";"hab";"ign";"mit";"run";"use");"h",("ino";"yme");"i",("d",("er";"ge");"g",("ht";"id";"or");"p","e",("n";"r");"s",("e",("n";"r");"ky");"v",("e",("r";"t");"al");"fle";"nse");"o",("a",("ch";"st");"b",("in";"ot");"g",("er";"ue");"o",("my";"st");"u",("g",("e";"h");"nd";"se";"te");"w",("dy";"er");"cky";"deo";"tor";"ver";"yal");"u",("d",("dy";"er");"m",("ba";"or");"gby";"ler";"pee";"ral";"sty"));"s",("a",("l",("v",("e";"o");"ad";"ly";"on";"sa";"ty");"n",("dy";"er");"t",("in";"yr");"u",("c",("e";"y");"na";"te");"v",("o",("r";"y");"vy");"dly";"fer";"int";"ppy";"ssy");"c",("a",("l",("d";"e";"p";"y");"r",("e";"f";"y");"mp";"nt");"e","n",("e";"t");"o",("r",("e";"n");"u",("r";"t");"ff";"ld";"ne";"op";"pe";"wl");"r",("a",("m";"p");"e",("e";"w");"u",("b";"m"));"ion";"uba");"e",("r",("if";"um";"ve");"v","e",("n";"r");"dan";"edy";"gue";"ize";"men";"nse";"pia";"tup";"wer");"h",("a",("d",("e";"y");"k",("e";"y");"l",("e";"l";"t");"r",("d";"e";"k";"p");"ck";"ft";"me";"nk";"pe";"ve";"wl");"e",("e",("n";"p";"r";"t");"l",("f";"l");"ar";"ik");"i",("n",("e";"y");"r",("e";"k";"t");"ed";"ft");"o",("o",("k";"t");"r",("e";"n";"t");"w",("n";"y");"al";"ck";"ne";"ut";"ve");"r",("u",("b";"g");"ew");"u",("ck";"nt";"sh");"yly");"i",("e",("ge";"ve");"g",("ht";"ma");"l",("ky";"ly");"n",("ce";"ew";"ge");"x","t",("h";"y");"ren";"ssy");"k",("i",("er";"ff";"ll";"mp";"rt");"u",("l",("k";"l");"nk");"ate");"l",("a",("n",("g";"t");"ck";"in";"sh";"te";"ve");"e",("e",("k";"p";"t");"pt");"i",("c",("e";"k");"m",("e";"y");"n",("g";"k");"de");"o",("op";"pe";"sh";"th");"u",("n",("g";"k");"mp";"rp";"sh");"yly");"m",("a",("ck";"ll";"rt";"sh");"e",("l",("l";"t");"ar");"i",("t",("e";"h");"le";"rk");"o",("k",("e";"y");"ck";"te"));"n",("a",("k",("e";"y");"r",("e";"l");"ck";"il");"e",("ak";"er");"i",("de";"ff";"pe");"o",("r",("e";"t");"op";"ut";"wy");"u",("ck";"ff"));"o",("l",("ar";"id";"ve");"n",("ar";"ic");"o","t",("h";"y");"u",("nd";"th");"apy";"ber";"ggy";"rry";"wer");"p",("a",("r",("e";"k");"ce";"de";"nk";"sm";"wn");"e",("a",("k";"r");"l",("l";"t");"n",("d";"t");"ck";"ed";"rm");"i",("c",("e";"y");"e",("d";"l");"k",("e";"y");"l",("l";"t");"n",("e";"y");"re";"te");"l",("at";"it");"o",("o",("f";"k";"l";"n");"r",("e";"t");"il";"ke";"ut");"r",("ay";"ee";"ig");"u",("r",("n";"t");"nk"));"q","u",("a",("d";"t");"ib");"t",("a",("i",("d";"n";"r");"l",("e";"k";"l");"n",("d";"k");"r",("e";"k";"t");"ck";"ff";"ge";"ke";"mp";"sh";"te";"ve");"e",("a",("d";"k";"l";"m");"e",("d";"l";"p";"r");"in";"rn");"i",("l",("l";"t");"n",("g";"k";"t");"ck";"ff");"o",("n",("e";"y");"o",("d";"l";"p");"r",("e";"k";"m";"y");"ck";"ic";"ke";"le";"mp";"ut";"ve");"r",("a",("p";"w";"y");"ip";"ut");"u",("n",("g";"k";"t");"ck";"dy";"ff";"mp");"yle");"u",("i",("ng";"te");"l",("ky";"ly");"r",("er";"ge";"ly");"ave";"gar";"mac";"nny";"per";"shi");"w",("a",("m",("i";"p");"rm";"sh";"th");"e",("a",("r";"t");"e",("p";"t");"ll";"pt");"i",("n",("e";"g");"ft";"ll";"rl";"sh");"o",("o",("n";"p");"r",("d";"e";"n"));"ung");"y",("nod";"rup"));"t",("a",("b",("by";"le";"oo");"c",("it";"ky");"k","e",("n";"r");"l",("ly";"on");"n","g",("o";"y");"p",("er";"ir");"r",("dy";"ot");"s","t",("e";"y");"ffy";"int";"mer";"tty";"unt";"wny");"e",("a",("ch";"ry";"se");"n",("et";"or";"se";"th");"p",("ee";"id");"r",("ra";"se");"ddy";"eth";"mpo";"sty");"h",("e",("ft";"ir";"me";"re";"se";"ta");"i",("n",("g";"k");"ck";"ef";"gh";"rd");"o",("ng";"rn";"se");"r",("e",("e";"w");"o",("b";"w");"um");"u","m",("b";"p");"ank";"yme");"i",("g",("er";"ht");"m",("er";"id");"t",("an";"he";"le");"ara";"bia";"dal";"lde";"psy");"o",("d",("ay";"dy");"n",("al";"ga";"ic");"p",("az";"ic");"r",("ch";"so";"us");"t",("al";"em");"u",("ch";"gh");"w","e",("l";"r");"x","i",("c";"n");"ast";"ken";"oth");"r",("a",("c",("e";"k";"t");"i",("l";"n";"t");"de";"mp";"sh";"wl");"e",("a",("d";"t");"nd");"i",("a",("d";"l");"c",("e";"k");"be";"ed";"pe";"te");"o",("ll";"op";"pe";"ut";"ve");"u",("c",("e";"k");"s",("s";"t");"er";"ly";"mp";"nk";"th");"yst");"u",("b",("al";"er");"l",("ip";"le");"mor";"nic";"rbo";"tor");"w",("e",("e",("d";"t");"ak");"i",("ce";"ne";"rl";"st";"xt");"ang");"ying");"u",("l",("cer";"tra");"n",("c",("le";"ut");"d",("er";"id";"ue");"f",("ed";"it");"i",("t",("e";"y");"fy";"on");"t","i",("e";"l");"lit";"met";"set";"wed";"zip");"p",("per";"set");"r",("ban";"ine");"s",("u",("al";"rp");"age";"her";"ing");"t",("ile";"ter");"dder";"mbra");"v",("a",("l",("et";"id";"or";"ue";"ve");"p",("id";"or");"u",("lt";"nt");"gue");"e",("n",("om";"ue");"r",("s",("e";"o");"ge";"ve");"gan");"i",("g",("il";"or");"r",("al";"us");"s",("it";"or";"ta");"car";"deo";"lla";"nyl";"ola";"per";"tal";"vid";"xen");"o",("i",("ce";"la");"cal";"dka";"gue";"mit";"ter";"uch";"wel");"ying");"w",("a",("g",("er";"on");"i",("st";"ve");"t",("ch";"er");"cky";"fer";"ltz";"rty";"ste";"ver";"xen");"e",("a",("ry";"ve");"i",("gh";"rd");"l",("ch";"sh");"dge";"edy";"nch");"h",("a",("ck";"le";"rf");"e",("at";"el";"lp";"re");"i",("n",("e";"y");"ch";"ff";"le";"rl";"sk";"te");"o",("le";"op";"se"));"i",("d",("e",("n";"r");"ow";"th");"n",("c",("e";"h");"dy");"s",("er";"py");"t",("ch";"ty");"eld";"ght";"lly";"mpy");"o",("m",("an";"en");"o",("dy";"er";"ly";"zy");"r",("s",("e";"t");"dy";"ld";"ry";"th");"u",("ld";"nd");"ken";"ven");"r",("a",("ck";"th");"e",("ak";"ck";"st");"i",("ng";"st";"te");"o",("ng";"te");"ung";"yly"));"y",("e","a",("rn";"st");"o","u",("ng";"th");"acht";"ield");"z",("e",("bra";"sty");"onal")).