サイズについてこれを試してください:
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) :- 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))).
試してみます ( のバインディングを表示せずにT
):
?- 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
、結果を得ることができます。