木の葉の情報をリストに載せるプログラムを書きたい。私はこれをやってみました:
leaves(l(_), [_]).
leaves(b(B1, B2), [L]):- leaves(B1, [L1]), leaves(B2, [L2]). append(L1, L2, L).
しかし、それは私に与えますL=[_A]
。何故ですか?
コードにいくつかのエラーがあります。正しいコードは次のようになります。
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
,
また、リストを説明するときは、DCG表記の使用を検討してください。
leaves(l(L)) --> [L].
leaves(b(B1,B2)) --> leaves(B1), leaves(B2).
使用法:?- phrase(leaves(Tree), Leaves)
。
を使用してプログラムをデバッグします。trace
これにより、クエリが段階的に実行されるため、結果が間違っている理由を確認できます。基本的に、svickが述べているように、通常はシングルトン変数(宣言されているが使用されていない、つまりインスタンス化されている)によって引き起こされるリストエントリとして指定された変数。