Prolog 写経記 その 45 union/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
union/2
を写経します.なんか大したことがないので連チャン.
解説
union(Sets, Union)
は集合の集まりであるSets
の和Union
(和集合となる) を返す.
ふむ.Java でいうと... ないかも.JGL でいうと... ないかも.
こういうのって使うのかなぁ?
モード
union(+, -).
ふむ.
定義
では,こいつの定義を写経しませう.
union([[]], []). union([[X | Rest]], [X | Rest]) :- !. union([Set | Sets], Union) :- union(Sets, U), union(Set, U, Union).
ふむ.
最初の節は停止条件なのでスルーして,2 番目の節から.
intersect/2
と同じく回りくどいことをやってますが,集合のリストに要素であるところの集合が一つしかない場合はそれが結果だということですね.
そして 3 番目の節.intersect/2
はほげほげぇでしたがこっちはまともですね.第 1 引数で与えられた集合のリストを最初の要素 Set
と残りの要素からなるリスト Sets
に分けて,Sets
の和集合を U
とすると,Set
と U
の和集合が結果ということですね.
注記
結合性によって,和演算は任意の数の集合に対して適用できる.そして全ての集合の要素の集まりが答えとして返される.
ふむ.
例
では使用例を写経しませう.
6 ?- union([[b, a, c, d][, [c, e, b], [d, a, b, c]], U). ERROR: Syntax error: Operator expected ERROR: union([[b, a, c, d][, [c, e, b ERROR: ** here ** ERROR: ], [d, a, b, c]], U) .
をいをい!!
そりゃあダメでしょう.角括弧を閉じるのが一つ余計ですね.
気を取り直して...
6 ?- union([[b, a, c, d], [c, e, b], [d, a, b, c]], U). U = [e, d, a, b, c] Yes 7 ?- union([[b, a, c, d], [c, e, b], [d, a, b, c], []], U1). U1 = [e, d, a, b, c] Yes
ふむ.
今回もまた intersect/2
の再利用です.心より恥じる.