Prolog 写経記 その 39 intersect/3

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

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

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

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

解説

intersect(Set1, Set2, Int) は集合 Set1Set2 の積 Int (積集合となる) を返す.

ふむ.Java でいうと... ないかも.JGL なら SetOperations#setIntersection() みたいな.

モード

intersect(+, +, -).

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

定義

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

intersect([], _, []).
intersect([X|Set1], Set2, [X|Int]) :-
	element(X, Set2), !,
	intersect(Set1, Set2, Int).
intersect([_|Set1], Set2, Int) :-
	intersect(Set1, Set2, Int).

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

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

2 ?- intersect([i, j, k, l, m], [n, m, l, k], X).

X = [k, l, m] 

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

Y = [m, l, k] 

Yes
4 ?- intersect([n, m, l, k], [], Z).

Z = [] 

Yes

ふむ.
またしても特にどうということもない感じ.