Prolog 写経記 その 35 card/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
card/2
を写経します.「2章 集合操作」に突入です.
解説
card(Set, N)
はN
をSet
中の要素の数を示す整数に具体化したり,N
がSet
中の要素の数と等しいかどうかを検査したりする.
ふーん.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(?, ?)
になってると思うけど?
うーみゅ...