Es gibt ein wunderbares Problem-Set namens Ninety-Nine Prolog-Probleme . Das Problem P70 ist dasjenige, das im Titel genannt wird. Und hier ist ein großartiger Prolog Lösung dieses Problems, das nur 5 Zeilen umfasst. Mein Verständnis von Prolog ist jedoch begrenzt.
Wie sieht diese Lösung in einer C-ähnlichen Form aus (keine itertools verfügbar)?
Auf Wunsch editiert. Ich hoffe, ich verstoße nicht gegen das Urheberrecht.
Das Problem:
Syntax in BNF:
tree ::= letter forest '^'
forest ::= | tree forest
Eine schöne Lösung mit Differenzlisten:
tree(TS,T) :- atom(TS), !, atom_chars(TS,TL), tree_d(TL-[ ],T). % (+,?)
tree(TS,T) :- nonvar(T), tree_d(TL-[ ],T), atom_chars(TS,TL). % (?,+)
tree_d([X|F1]-T, t(X,F)) :- forest_d(F1-['^'|T],F).
forest_d(F-F,[ ]).
forest_d(F1-F3,[T|F]) :- tree_d(F1-F2,T), forest_d(F2-F3,F).