Prolog 写経記 その 44 union/3

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

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

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

今日は union/3 を写経します.
順番だと union/2 が先なのですが,その中で union/3 を使っているのでこちらを先に.

解説

union(Set1, Set2, Int) は集合 Set1Set2 の和 Union (和集合となる) を返す.

ふむ.Java でいうと... ないかも. Set#addAll(Collection) で同じことになりますね.JGL なら SetOperations#setUnion() みたいな.

モード

union(+, +, -).

ふむ.二つの集合は共に与えないといけないらしい.
そして第 3 引数に具体的なリストを与えて,それが第 1・第 2 引数で与えた集合の和集合かどうかをテストすることはできないのですね.
まぁ,集合とはいっても所詮はリストですからね.要素の順序が違ってもテストできるというとちょっと大変かも.

定義

では,こいつの定義を写経しませう.

union([], Set, Set).
union([X|Set1], Set2, Union) :-
	element(X, Set2), !,
	union(Set1, Set2, Union).
union([X|Set1], Set2, [X|Union]) :-
	union(Set1, Set2, Union).

ふむ.
最初の節は停止条件なのでスルーして,2 番目の節では第 1 引数で与えられたリストの最初の要素 X が第2引数で与えられた集合の要素であれば,第 1 引数で与えられた集合の 2 番目以降の要素からなる集合と第 2 引数で与えられた集合の和集合にXを加えたものが結果ですよ,と.
そして第 1 引数で与えられたリストの最初の要素が第2引数で与えられた集合の要素でなければ,第 1 引数で与えられた集合の 2 番目以降の要素からなる集合と第 2 引数で与えられた集合の和集合が結果ですよ,と.
ふむふむふむ.

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

3 ?- union([i, j, k, l, m], [n, m, l, k], X).

X = [i, j, n, m, l, k] 

Yes
4 ?- union([n, m, l, k], [i, j, k, l, m], Y).

Y = [n, i, j, k, l, m] 

Yes
5 ?- union([n, m, k, l], [], Z).

Z = [n, m, k, l] 

Yes

ふむ.
またしても特にどうということもない感じ.
っていうか,基本的に intersection/3 と同じ.
そんなわけで (どんなわけで?),このエントリもそれをコピペして再利用です.心より恥じる.