2

目標を満たすオブジェクトの順序付きリストが必要です。setofは順序を処理しますが、ゴールを満たすオブジェクトがない場合は失敗します。代わりに空のリストを返したいのですfindall

これは機能しますが、カットせずにこれを達成する方法はありますか? SWI-Prolog を使用しています。

setof(Object, Goal, List), !; List = [].
4

3 に答える 3

1
(setof(Object, Goal, List) ; List = [])

同様に機能します(setof自体は決定論的です)。

選択ポイントを確実に取り除くには、もう少し冗長にする必要があります

(setof(Object, Goal, List) -> true ; List = [])

そのまま編集すると、私の答えは明らかに間違っているか、少なくとも非常に不完全です。虚偽のコメントと回答の後、私は提案します

setof(Object, Goal, List) *-> true ; List = [].
于 2013-12-05T18:48:33.477 に答える
0

潜在的な非決定性や setof の変数量化機能が必要ない場合は、 findall/3 を使用できます。これは決定論的であり、失敗しません。

?- findall(X, fail, Xs).
Xs = []
yes

その後、sort/2 を使用して結果を自分で並べ替えることができます。

findall(Object, Goal, UnsortedWithDuplicates),
sort(UnsortedWithDuplicates, List)
于 2013-12-05T19:13:42.817 に答える