0

木の葉の情報をリストに載せるプログラムを書きたい。私はこれをやってみました:

leaves(l(_), [_]). 
leaves(b(B1, B2), [L]):- leaves(B1, [L1]), leaves(B2, [L2]). append(L1, L2, L). 

しかし、それは私に与えますL=[_A]。何故ですか?

4

3 に答える 3

2

コードにいくつかのエラーがあります。正しいコードは次のようになります。

leaves(l(X), [X]).
leaves(b(B1, B2), L):- leaves(B1, L1), leaves(B2, L2), append(L1, L2, L).

主な問題はの使用だったと思います_。これは匿名変数であり、「何でもここにあることができる」という意味です。また、1つの用語で2回使用する場合、両方_とも異なる変数になります。

また、の代わりに.前にあります。私のPrologインタープリター(SWI-Prolog)は、シングルトン変数に関する2つの警告を報告しました。それらを無視するべきではありません。append,

于 2011-09-04T13:17:05.057 に答える
2

また、リストを説明するときは、DCG表記の使用を検討してください。

leaves(l(L))     --> [L].
leaves(b(B1,B2)) --> leaves(B1), leaves(B2).

使用法:?- phrase(leaves(Tree), Leaves)

于 2011-09-04T14:13:39.913 に答える
0

を使用してプログラムをデバッグします。traceこれにより、クエリが段階的に実行されるため、結果が間違っている理由を確認できます。基本的に、svickが述べているように、通常はシングルトン変数(宣言されているが使用されていない、つまりインスタンス化されている)によって引き起こされるリストエントリとして指定された変数。

于 2011-09-04T13:47:41.653 に答える