1

私の目標は、次のような情報を提供することです。

L = [a,b,c], build_tree(L,T).

この出力で:

L = [1,30,kth,5],
T = b(l(a),b(l(b),b(l(c)))) ? 

yes

そして、このコードを使用すると、ツリーの葉の数がカウントされます。

leaves(l(X), [X]).
leaves(b(L1,L2),V):-
    leaves(L1,V1),
    leaves(L2,V2),
    append(V1,V2,V).

入力としてツリーではなくリストを関数に与えるだけで、目的の出力を取得できます。例:

L = [a,b,c], leaves(T,L).

ここでの唯一の問題は、引数が間違った順序で取得されることです(つまり、build_tree(L、T)ではなくbuild_tree(T、L))。

では、どうすれば同じ結果を生成できますが、入力引数を単純に入れ替えることができますか?私はすべての「明白な」解決策(変数を入れ替える)を試しましたが、再帰的な方法であるため、見た目ほど簡単ではないかもしれないと推測しています。

4

2 に答える 2

2

また、DCGの使用を検討してください。

leaves(l(X))     --> [X].
leaves(b(T1,T2)) --> leaves(T1), leaves(T2).
于 2012-01-19T15:24:57.513 に答える
1

述語があり、引数を並べ替えたい場合、最も簡単な方法(imo)は、ラッパー述語を作成することです。

my_foo(X,Y,Z):-
    foo(Y,Z,X).

foo(X,Y,Z):- ....
于 2011-09-14T21:40:05.167 に答える