Prolog 写経記 その 22 occurs/3
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
occurs/3
を写経します.解説
occurs(X, List, N)
はList
中に要素X
が現れる数を返す.
ふむ.これも Java にそのまんまはない... ですよね.
JGL なら Counting.countIf(container, new BindFirst(new EqualsTo(), x))
みたいな.
モード
occurs(+, +, ?)
めずらしく 2 引数を具体化してあげないといけないらしい.
定義
では,こいつの定義を写経しませう.
occurs(_, [], 0). occurs(X, [X | List], N) :- !, occurs(X, List, M), N is M + 1. occurs(X, [_ | List], N) :- occurs(X, List, N).
なんか,やることがたいしたことなさそうな割には面倒そうですね.
最初の節
occurs(_, [], 0).
は繰り返しの停止条件.Java なんかだと for
文中の条件に相当.
2番目の節
occurs(X, [X | List], N) :- !, occurs(X, List, M), N is M + 1.
は与えられたリストの先頭の要素が第 1 引数 X
とマッチした場合.
その場合はリストの残りに X
が含まれる数に + 1
したものが結果ですよ,と.
最後の節
occurs(X, [_ | List], N) :- occurs(X, List, N).
は与えられたリストの先頭の要素が第 1 引数 X
とマッチしなかった場合.
その場合はリストの残りに X
が含まれる数が結果ですよ,と.
例
では使用例を写経しませう.
2 ?- occurs(a, [c, b, c, a, b, c, a], N). N = 2 Yes 3 ?- occurs(c, [c, b, c, a, b, c, a], 3). Yes 4 ?- occurs(b, [c, b, c, a, b, c, a], 1). No
まぁ,どうということもない結果.
ちょっとつまらなかったかもぉ〜.