Prolog 写経記 その 37 element/2

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

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

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

今日は element/2 を写経します.

解説

element(X, Set) は要素 X が集合 Set に属するかどうか (メンバか否か) を調べたり,バックトラックを通じて Set の各要素を返したりする.

ふむ.Java でいうと Set#contains(Object) ですね.加えて iterator() っぽくも使えるという.

モード

element(?, +).

ふむ.集合はちゃんと与えないといけないらしい.

定義

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

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

ふむ.集合の最初の要素が X か,残りの要素からなる集合のメンバーなら X は集合のメンバーですよ,と.

注記

element/2 とリスト処理述語 member/2 を比較してみよ.

らじゃあ.
そんなわけで (どんなわけで?),member/2

member(X, [X|_]).
member(X, [_ | List]) :-
	member(X, List).

...
同じじゃん.
でもでも,member/2 のモードは member(?, ?) なんだよね.どうして element/2element(?, +) なんだろう?
っていうか,member/2 がどうして member(?, ?) と言い張るのかが分からない...

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

6 ?- element(7, [3, 1, 5, 7, 4]).

Yes
7 ?- element(7, [3, 1, 5, 6, 4]).

No
8 ?- element(X, [q, r, s]).

X = q ;

X = r ;

X = s 

Yes

ふむ.
特にどうという事もない感じ.
最近はこんなんばっかだなぁ.