IF Computer > IF/Prolog > Manuals > IF/Prolog V4.1 マニュアル > IF/Prolog V4.1 レファレンスマニュアル > #bagof, #setof

#bagof, #setof

IF/Prolog by Siemens
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. Dedicated technical support for IF/Prolog ended Dec 31 2008. This site is maintained as a community service only.

# 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 「ゴール」が正しい値を与えられていない

document: http://www.ifcomputer.co.jp/IFProlog/Manuals/v4.1/reference/bagof/print_en.html
published 2012/5/21 update 1995/11/6 (c) 1996-2009 IF Computer Japan
IF Computer 5-28-2 Sendagi, Bunkyo-ku Tel +81-3-5814-3352 start (AT) ifcomputer.com
Customer Support Tokyo 113-0022 Japan   http://www.ifcomputer.com
Back> managed with ubiCMS