Prolog 写経記 その 41 intersects/3

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

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

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

今度は intersects/3 を写経します.
積集合シリーズまとめて一気.

解説

intersects(Set, Sets, Ints) は集合 Set と集合の集まりである Sets の要素との積をそれぞれ見つける.結果 Ints は集合の集まりである.

ちょっと分かりにくいけど,SetSets の n 番目の要素であるところの集合との積集合が結果のリストの n 番目の要素になるってことね.
らじゃあ.

モード

intersects(+, +, -).

ふむ.

定義

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

intersects(_, [], []).
intersects(Set, [S], [Int]) :-
	!,
	intersect(Set, S, Int).
intersects(Set, [S | Sets], [Int | Ints]) :-
	intersect(Set, S, Int),
	intersects(Set, Sets, Ints).

ふむ.
最初の節は停止条件なのでスルーして,2 番目の節から.
これはさっきの intersect/2 の 2 番目の節と似てますね.っていうか,こっちは素直に書いてるし.
ともあれ (JW),集合のリストに要素が一つしかない場合は,第1引数の集合との積集合が結果のリストの唯一の要素になるわけですね.
んで,3 番目の節は第 2 引数に複数の要素 (集合) がある場合,第 1 引数の集合と第 2 引数の最初の要素である集合との積集合 Int と,第1引数の集合と第 2 引数の残りの要素とからなるリストの積集合のリスト Ints を連結したものが結果ですよ,と.
まぁ,自然な感じ.

注記

intersect/2 との違いとしては,この述語では SetSets 中の全ての集合との積が順次求められ,集合の集まりの形で返される.

らじゃあ.

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

27 ?- intersects([x, y, z], [[u, w, z], [w, x, y, z], [], [u,v]], L).

L = [[z], [x, y, z], [], []] 

Yes

ふむ.特にどうという事もなく.