5

プロローグで各結果を 1 回だけ返すクエリを作成する簡単な方法はありますか?

たとえば、私は次のようなことを試みています:

deadly(Xn) :- scary(X), Xn is X - 1, Xp is X + 1, not(safe(Xn)), safe(Xp).
deadly(Xp) :- scary(X), Xn is X - 1, Xp is X + 1, not(safe(Xp)), safe(Xn).

deadly(X).

そして得る

X = 5

X = 5

X = 5

X = 5

....

私にとって役に立たない。

4

4 に答える 4

4

できることの 1 つはsetof/3、ソリューションを生成する述語に適用することです。ただし、によって配信された結果setof/3に適用することによって実装されることに注意してください(少なくともこれは SWI-Prolog の場合です)。したがって、ソリューションジェネレーターが永遠に続く場合、適用されることはありません...sort/2bagof/3setof/3

したがって、重複が生成されないように、つまり意味のあるカット (!) を使用して、プログラムを作成してください。

于 2009-04-07T12:43:48.397 に答える
3

私の記憶が正しければ、リストに一意のソリューションを収集する述語ソリューション (または同様の、Prolog をプログラムしてからしばらく経ちます) があります。

編集: setof/3私が考えていたものです。ありがとう、カーレル。

于 2009-04-07T08:34:33.347 に答える
1

これ以上のコードなしで言うのは難しいですが、おそらくカット演算子 ( ) を探しているでしょう!の定義を投稿したい場合はfoo、私 (またはフォローしている他の誰か) が詳細な/具体的な回答を提供できる場合があります。

于 2009-04-07T06:39:28.227 に答える