Prolog 写経記 その 36 difference/3

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

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

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

今日は difference/3 を写経します.

解説

difference(Set1, Set2, Diff) は 2 つの集合 Set1Set2 の違い Diff (差集合となる) を返す.

ふむ.Java でいうと... 副作用があるけど Set#removeAll(Collection) みたいな.

モード

difference(+, +, -).

ふむ.二つの集合は共に与えないといけないらしい.

定義

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

difference([], _, []).
difference([X | Set1], Set2, Diff) :-
	element(X, Set2), !,
	difference(Set1, Set2, Diff).
difference([X | Set1], Set2, [X | Diff]) :-
	difference(Set1, Set2, Diff).

未知の述語 element/2 が使われています.次ページに出てくるのですが,とりあえず今は無視.
その element/2 が2番目と3番目の節のどちらを選択するかの条件になっていますね.element/3 の後にカットが付いているのはそのため.
んで,XSet2 の要素なら残りの要素からなる集合と Set2 の差集合が結果だし,XSet2 の要素でなければ残りの要素からなる集合と Set2 の差集合に X を加えた集合が結果ですよ,と.
ふむ.

注記

この述語は可換的でないため difference(Set1, Set2, Diff1)difference(Set2, Set1, Diff2) は異なった結果を返す.

らじゃあ.

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

5 ?- difference([2, 4, 5, 8], [1, 3, 4, 5, 9], X).

X = [2, 8] 

Yes
6 ?- difference([1, 3, 4, 5, 9], [2, 4, 5, 8], Y).

Y = [1, 3, 9] 

Yes

ふむ.
特にどうという事もない感じ.