Prolog 写経記 その 41 intersects/3
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
intersects/3
を写経します.積集合シリーズまとめて一気.
解説
intersects(Set, Sets, Ints)
は集合Set
と集合の集まりであるSets
の要素との積をそれぞれ見つける.結果Ints
は集合の集まりである.
ちょっと分かりにくいけど,Set
と Sets
の 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
との違いとしては,この述語ではSet
とSets
中の全ての集合との積が順次求められ,集合の集まりの形で返される.
らじゃあ.
例
では使用例を写経しませう.
27 ?- intersects([x, y, z], [[u, w, z], [w, x, y, z], [], [u,v]], L). L = [[z], [x, y, z], [], []] Yes
ふむ.特にどうという事もなく.