表示された出力から、GNU Prolog を使用していると思います。しかし、最初に重要な注意事項があります。
配置したカットが意図したとおりにカットされない! 実際、答えが 1 つであることを妨げるものではありません。その証拠は次のとおりです。
| ?- member1(X,[1,2,3]).
X = 1 ? ;
X = 2
yes
したがって、まだ2つの答えがあります。経験則として: 再帰ゴールの後のカットはしばしば予期しないことをします。
正確に最初の答えが欲しい場合は、単純にonce(member(X,[1,2,3]))
. これonce/1
も事実上のカットですが、かなり変装しています。まさに1つのことをするのは飼いならされています。はい、カットを再帰ルールに配置することもできますが、初心者の場合は後のレッスンに任せたほうがよいでしょう。
これらすべての背後には、あまり目立たないもう 1 つのポイントがあります。GNU Prolog のトップレベル シェルは、開いている代替案 (専門用語: 選択ポイント) を検出すると、さらなる解決策を求めます。したがって、GNU がさらに質問した場合、GNU はまだ調査していない部分があることを認識していますが、実際には別の答えがあるという保証はありません。
?- member(1-X,[1-a,2-b,3-c]).
X = a ? ;
no
ここで、トップレベルは未解決の選択ポイントを認識し、クエリをさらに調査するかどうかを尋ねます。悲しいかな、この検索は無駄です...