2

私は Prolog を (SWI-Prolog を使用して) 試してみましたが、すべてが思いどおりに機能します。つまり、ロジックは正しく計算され、適切なソリューションが見つかりますが、バックトラッキング全体が私を台無しにしています。

コードは次のとおりです。

tall(X) :- skinny(X) ; eatless(X).
eatless(X) :- playsmore(X).
playsmore(X) :- hasxbox(X) ; hasplaystation(X).

skinny(a).
vegetarian(a).
hasxbox(b).
eatsburger(c).
hasplaystation(d).

list_all_tall :- forall(tall(Tall), writeln(Tall)).

非常に基本的なもの。クエリの結果として得られるものは次のとおりです。

?- tall(a).
true ; % Note 1
false.

?- tall(b).
true ; % Note 2
false.

?- tall(c).
false.

?- tall(d).
true.

メモ 1 と 2 からわかるように、ヒット;して先に進むのを待ってから、最初のソリューションを null と見なし、最終的に false を出力します。

カットを使用してこの動作をより適切に制御できますが、次のコマンドも適切に機能するようにしたいと考えています。

?- tall(X).
X = a ;
X = b ;
X = d.

と:

?- list_all_tall.
a
b
d
true.

これらの 2 つのコマンドは、まさに私が望む方法でソリューションを提供します。私を壁に押し上げているのは、メモ1と2のものだけです。と の機能を現在のように維持しながら、tall(X).との機能を好みに合わせてlist_all_tall.修正する方法はありますか。tall(a).tall(b).true.tall(a).tall(b).

率直な回答をする代わりに、誰かが実際に自分で修正する方法を説明してくれるとありがたいです.Prologでの私の考え方はすべて下手なのかもしれません.

PS: 背が高い、痩せている、太っている、ハンバーガーを食べる、ビデオゲームをする、菜食主義者を攻撃する意図はありません。

4

3 に答える 3

3

常に予防できるとは限らないため、心配しないことが最善の方法です。

プロローグは、別の答えあることを知りません。別の答えがあるかもしれないことを知っているだけです。これを選択ポイントと呼びます。Prolog は選択肢に到達するたびに、選択ポイントを作成し、最初の選択肢に従います。そのオプションがうまくいかない場合は、最新の選択ポイントに戻り、次の選択肢を試します。答えが見つからずに選択肢がなくなった場合は、noまたはを取得しますfalse

アイテムがもうないことがわかっている場合に選択ポイントを取得しないように、コードを記述してみることができます。member/2たとえば、一部のプロローグでfalseは最後のアイテムの後に取得し、他のプロローグでは取得しません。しかし、すべての解決策の後に不適切な選択ポイントがあることは、構成の問題ではありません。あなたのユーザー インターフェイスは、ユーザーに Prolog のプロンプトを直接表示しない可能性があります。setof/3およびその他の論理外述語を使用して、すべてのソリューションを取得できます。世界falseに「漏れる」ことはありません。最初は少し不安ですが、あまり心配せずに信頼してください。

于 2014-01-06T18:17:19.467 に答える