# bagof(+テンプレート,+ゴール,-解答リスト) # setof(+テンプレート,+ゴール,-解答リスト)
「解答リスト」は、「ゴール」を満たす「テンプレート」の、すべての代入値のリストです。
「テンプレート」は、「ゴール」のどこかに現れていなければなりません。IF/Prologは「ゴール」を満たすすべての解を探し出し、「解答リスト」にすべての「テンプレート」の解を返します。解がない場合には、どちらの述語も失敗します。「ゴール」の自由変数に「テンプレート」に現れないものがある場合、バックトラッキングする毎に残った変数に対する異なる代入結果が得られます。
ゴールには、^ 演算子を使って存在限定子をつけることができます。これによって限定された変数はその値が一意になり、異なる値の代入が許されなくなります。
setof/3は重複した要素を取り除き、ソートされた「解答リスト」(集合)を返します。これに対してbagof/3は、ゴール呼び出し後、単に結果を集めます。
たとえばデータベースが以下の場合、 test(a,b). test(a,c). test(a,b). test(b,d).
以下のような結果になります。
?- setof(X,test(Y,X),L).
X = _291 Y = a L = [b,c];
X = _291 Y = b L = [d];
no ?- bagof(X,test(Y,X),L).
X = _291 Y = a L = [b,c,b];
X = _291 Y = b L = [d];
no ?- setof(X,Y^test(Y,X),L).
X = _291 Y = _292 L = [b,c,d]
yes ?- bagof(X,Y^test(Y,X),L).
X = _291 Y = _292 L = [b,c,b,d]
yes
undefined_predicate 「ゴール」がデータベースで定義されていない illegal_predicate 「ゴール」が正しい値を与えられていない
| scroll to top |
|