Prolog 写経記 その 43 subset/2

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

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

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

今度は subset/2 を写経します.

解説

subset(SubSet, Set) は集合 SubSet 中の任意の要素が集合 Set の要素であるとき成功する.

ふむ.Java でいうと... Set#containsAll(Collection) みたいな.

モード

subset(+, +).

ふむ.集合操作は + が多いですね.

定義

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

subset([], _).
subset([X | Sub], Set) :-
	element(X, Set),
	subset(Sub, Set).

ふむ.
最初の節は停止条件なのでスルーして,2 番目の節.
第 1 引数で渡された集合を最初の要素 X と残りの要素からなる集合 Sub に分けて,X が第 2 引数で渡された集合 Set の要素でかつ,SubSet の部分集合なら真ということですね.
普通っぽい.

注記

subset/2 リスト処理述語 sublist/2 を比較してみよ.

らじゃあ.

sublist(Sub, List) :-
	conc(S, _, List),
	conc(_, Sub, S), !.

おっとぉ,全然違っていますね.
これは,リストが順序を持っているのに対して集合には順序がないからですね.
それにしても sublist/2 の定義すごいなぁ.

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

8 ?- subset([f, c, d], [d, a, f, e, c, b]).

Yes
9 ?- subset([f, c, g], [d, a, f, e, c, b]).

No
10 ?- subset([], [6, 8, 4, 5, 7]).

Yes
11 ?- subset([6, 8, 4, 5, 7], []).

No

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