Prolog 写経記 その 35 card/2

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

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

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

今日は card/2 を写経します.
「2章 集合操作」に突入です.

解説

card(Set, N)NSet 中の要素の数を示す整数に具体化したり,NSet 中の要素の数と等しいかどうかを検査したりする.

ふーん.card は cardinality のことね.
「1章 リスト処理」で出てきた (っていうか組み込み述語) length/2 と違うのだろうか?

モード

card(+, ?).

ふむ.Set は必須とな.
むむぅ... length/2

length(?, ?).

なんですが.そういう違いがあるのか.

定義

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

card([], 0).
card([_ | Set], N) :-
	card(Set, M),
	N is M + 1.

ぬぬぅ...
length/2 と一緒じゃん...
これでどうして card(+, ?) になるわけ?
わざわざ個別に定義する意味はあるのかなぁ?

注記

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

比較してもいいけどさ.

length([], 0).
length(_ | List], L) :-
	length(List, L1),
	L is L1 + 1.

一緒でしょ? どこが違うの?

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

4 ?- card([x, y, z], N).

N = 3 

Yes
5 ?- card([], P).

P = 0 

Yes
6 ?- card([u, 2, 3, _, 4, _, 1], 7).

Yes

念のため length/2 でも.

7 ?- length([x, y, z], N).

N = 3 

Yes
8 ?- length([], P).

P = 0 

Yes
9 ?- length([u, 2, 3, _, 4, _, 1], 7).

Yes

一緒だし.
さらに念のため length/2 の最後の例を card/2 で.

10 ?- card(L, 2), member(x1, L), member(x2, L).

L = [x1, x2] 

Yes

やっぱり一緒だし.っていうか,card(?, ?) になってると思うけど?
うーみゅ...