サイズのためにこれを試してみてください:(T
のバインディングを表示せずに)それを試し
tree(T) :- T = tree(f, tree(b, tree(a,void,void), tree(d,tree(c,void,void),tree(e,void,void))), tree(g, void, tree(i, tree(h,void,void),void))).
:
hereからツリーを表す事実と
dfs_paths(tree(X, void, void), [X]) :- !.
dfs_paths(tree(X, L, _R), [X|Xs]) :-
dfs_paths(L, Xs).
dfs_paths(tree(X, _L, R), [X|Xs]) :-
dfs_paths(R, Xs).
テストも実施
?- tree(T), dfs_paths(T, L).
L = [f, b, a] ;
L = [f, b, d, c] ;
L = [f, b, d, e] ;
L = [f, g, i, h]
dfs_paths/2
バックあなたに代替パスを与えるラック。あなたがアップフロントそれらすべてのリストを望んでいた場合、あなたは試みることができる:
?- tree(T), findall(P, dfs_paths(T, P), Ps).
Ps = [[f, b, a], [f, b, d, c], [f, b, d, e], [f, g, i, h]].
あなたは上に書いてきたように、あなたが用語のフラットリストを望んでいた場合は、結果をflatten/2
することができます。
非常に良い!カットを削除すると、すべての方向で使用できます。リストを記述するときは、DCG表記の使用を検討してください。この場合はあまり便利ではありませんが、より便利です。 – mat