99プロローグ問題と呼ばれる素晴らしい問題セットがあります。問題P70はタイトルで言及されているものです。そしてここに、たった5行しかかからないこの問題の素晴らしいPrologソリューションがあります。ただし、Prologについての私の理解は限られています。
このソリューションは、Cのような形式(itertoolsは利用できません)ではどのように見えますか?
リクエストにより編集。私は著作権を侵害しないことを望みます。
問題:
BNFの構文:
tree ::= letter forest '^'
forest ::= | tree forest
差分リストを使用した優れたソリューション:
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).