symbol(1,"the"). symbol(2,"quick"). symbol(3,"brown"). symbol(4,"fox"). symbol(5,"jumped"). symbol(6,"over"). symbol(7,"the"). symbol(8,"lazy"). symbol(9,"dog"). list(10). listindex(10,0,1). listindex(10,1,2). listindex(10,2,3). list(11). listindex(11,0,4). listindex(11,1,5). listindex(11,2,6). listindex(11,3,7). listindex(11,4,8). listindex(11,5,9). list(12). listindex(12,0,10). listindex(12,1,13). listindex(12,2,11). listindex(12,3,11). list(13). root(12). listcount(?id, #max(?index + 1)) :- list(?id), listindex(?id, ?index, ?subid). listcount(?id, 0) :- list(?id), ~listindex(?id, ?index, ?subid). obj(?id) :- symbol(?id, ?str). obj(?id) :- list(?id). % toposorting; did not end up needing it % dist(1, ?id, ?subid) :- listindex(?id, ?index, ?subid). % dist(?n + 1, ?id, ?subsubid) :- listindex(?id, ?index, ?subid), dist(?n, ?subid, ?subsubid). % toposort(0, ?x) :- obj(?x), ~dist(?n, ?x, ?y). % toposort(#max(?n), ?x) :- dist(?n, ?x, ?y). tostr(?id,?str) :- symbol(?id, ?str). tostr(?id,CONCAT("(",CONCAT(?str,")"))) :- listcount(?id, ?n), cat(?id, ?n, ?str). tostr(?id,"()") :- listcount(?id, 0). cat(?id, 1, ?a) :- listindex(?id,0,?subid), tostr(?subid, ?a). cat(?id, ?n + 1, CONCAT(?a, CONCAT(" ", ?b))) :- cat(?id, ?n, ?a), listindex(?id,?n,?subid), tostr(?subid, ?b). result(?str) :- root(?id), tostr(?id, ?str). @export result :- csv{resource = ""}.