Prolog 写経記 その 45 union/2

(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.

Prologユーティリティライブラリ

Prologユーティリティライブラリ

今度は 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 とすると,SetU の和集合が結果ということですね.

注記

結合性によって,和演算は任意の数の集合に対して適用できる.そして全ての集合の要素の集まりが答えとして返される.

ふむ.

では使用例を写経しませう.

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 の再利用です.心より恥じる.