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