Prolog 写経記 その 22 occurs/3

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

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

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

今日は 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

まぁ,どうということもない結果.
ちょっとつまらなかったかもぉ〜.