目標を満たすオブジェクトの順序付きリストが必要です。setof
は順序を処理しますが、ゴールを満たすオブジェクトがない場合は失敗します。代わりに空のリストを返したいのですfindall
。
これは機能しますが、カットせずにこれを達成する方法はありますか? SWI-Prolog を使用しています。
setof(Object, Goal, List), !; List = [].
目標を満たすオブジェクトの順序付きリストが必要です。setof
は順序を処理しますが、ゴールを満たすオブジェクトがない場合は失敗します。代わりに空のリストを返したいのですfindall
。
これは機能しますが、カットせずにこれを達成する方法はありますか? SWI-Prolog を使用しています。
setof(Object, Goal, List), !; List = [].
(setof(Object, Goal, List) ; List = [])
同様に機能します(setof自体は決定論的です)。
選択ポイントを確実に取り除くには、もう少し冗長にする必要があります
(setof(Object, Goal, List) -> true ; List = [])
そのまま編集すると、私の答えは明らかに間違っているか、少なくとも非常に不完全です。虚偽のコメントと回答の後、私は提案します
setof(Object, Goal, List) *-> true ; List = [].
潜在的な非決定性や setof の変数量化機能が必要ない場合は、 findall/3 を使用できます。これは決定論的であり、失敗しません。
?- findall(X, fail, Xs).
Xs = []
yes
その後、sort/2 を使用して結果を自分で並べ替えることができます。
findall(Object, Goal, UnsortedWithDuplicates),
sort(UnsortedWithDuplicates, List)