集合とバッグの操作についてのソースファイルは、$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の要素をすべてもつ集合を作り和とする。
| 冒頭へ |
|