| ||||||||||
| 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の要素をすべてもつ集合を作り和とする。 | ||||||||||
|
| Back> |
|