集合とバッグ
MINERVA superseeded IF/Prolog. Please see http://www.ifcomputer.co.jp/MINERVA for details.

We discontinued to sell IF/Prolog Dec 31. 2003. For current customers, we continue to provide professional support for IF/Prolog until Dec 31, 2008.

集合とバッグの操作についてのソースファイルは、$PROROOT/library/data/bagsのディレクトリにあります。

集合はリストで表されていますが、その利点は要素が集合の中でたかだか一度しか現れないことです。それを利用した、効率の良い述語はsetutl.proにあります。順序集合の上ではさらに効率の良い手続きを作ることができ、それらはordset.proにはいっています。bagutl.proでは特別なデータ構造バッグを紹介し、これを扱う手続きが与えられます。バッグは、同じ要素が現れても良いように拡張された集合です。

以下の手続きが定義されています。

bagutl.proファイル ------------------ is_bag(+バッグ) 「バッグ」がバッグとして適切なものであるかどうかを調べる。

portray_bag(+バッグ) 「バッグ」の内容を表示する。

checkbag(+述語,+バッグ) 述語(要素,Count)を適用する。

mapbag(+述語, +バッグイン, -バッグアウト) 述語(要素, 答え)を適用する。

bag_to_list(+バッグ. -リスト) バッグをリストに変換する。

bag_to_set(+バッグ, -集合) バッグを集合に変換する。すなわち、重複のない要素からなるリストを作成する。

member(?要素, ?要素の数, ?バッグ) ある要素がバッグのメンバーであるかどうかを調べる。あるいは、バッグの要素を一つ返す。

memberchk(?要素, ?要素の数, ?バッグ) member/3と同様であるが、バックトラックをしない。

bagmax(+バッグ, -最大要素) バッグの最大の要素を返す。

bagmin(+バッグ, -最小要素) バッグの最小の要素を返す。

length(+バッグ, -全要素の数, -異なる要素の数) バッグのすべての要素の数と互いに異なるようその数を計算する。

make_sub_bag(+バッグ1, -バッグ2) バッグ1のすべてのサブバッグをバッグ2に生成する。

test_sub_bag(+バッグ1, +バッグ2) バッグ1がバッグ2のサブバッグであるかどうかをテストする。

bag_union(+バッグ1, +バッグ2, -バッグの和) 2つのバッグの和を生成する。

bag_inter(+バッグ1, +バッグ2, -バッグの積) 2つのバッグの積を生成する。

ordset.proファイル ------------------ list_to_ord_set(+リスト, -集合) リストを順序集合に変換する。

ord_disjoint(+集合1, +集合2) 2つの順序集合に共通要素がないときに真。

ord_insert(+集合1, +要素, ?集合2) 集合1に要素を挿入したものを集合2に返す。

ord_intersect(+集合1, +集合2) 2つの順序集合に共通の要素が少なくとも1つあるとき真。

ord_intersect(+集合1, +集合2, +集合3) 2つの順序集合の積を集合3に返す。

ord_seteq(+集合1, +集合2) 集合1 == 集合2

ord_subset(+集合1, +集合2) 集合1のすべての要素が集合2に含まれている。

ord_subtract(+集合1, +集合2, ?差) 集合1のすべての要素から集合2に含まれる要素を除いたものを差とする。

ord_symdiff(+集合1, +集合2, ?差) 集合1と集合2との対称差を差とする。

ord_union(+集合1, +集合2, ?和) 集合1と集合2との和を和とする。

setutl.proファイル ------------------

memberchk(+要素, +集合) ある要素が集合の中にあることをチェックします。

nonmember(+要素, +集合) ある要素が集合の中にないことをチェックします。

add_element(+要素, +集合1, -集合2) 要素を集合1に(必要であれば)加えたものを集合2とする。

del_element(+要素, +集合1, -集合2) 集合2 = 集合1\{要素}

disjoint(+リスト) リストが集合として適切であるとき真。

disjoint(+集合1, +集合2) 所定の2集合が共通要素を持たないとき真。

select(?要素, ?集合, ?残り) 残り = 集合 \ {要素}。ただし、要素は集合の要素。

pairfrom(?集合1, ?要素1, ?要素2, ?集合2) 集合2 = 集合1 \ {要素1, 要素2}, 要素1 =\= 要素2

intersect(+集合1, +集合2) 2つの集合が要素を共有していれば真。

subset(+集合1, +集合2) 集合1の各要素が集合2に含まれるとき真。

seteq(+集合1, +集合2) 集合1のすべての要素が集合2にあり、その逆も成り立つ。

listtoset(+リスト, ?集合) リストのすべての要素を含み、その順序も保存した集合を作る。

intersect(+集合1, +集合2, ?積) 集合1と集合2との共通部分、積を作る。

subtract(+集合1, +集合2, ?集合3) 集合1から集合2に含まれる要素を除いた集合3を作る。

symdiff(+集合1, +集合2, ?差) 集合1と集合2との対称差を作り、差とする。

union(+集合1, +集合2, ?和) 集合1と集合2の要素をすべてもつ集合を作り和とする。


Up read on...