Prolog 写経記 その 39 intersect/3
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
intersect/3
を写経します.順番だと
intersect/2
が先なのですが,その中で intersect/3
を使っているのでこちらを先に.解説
intersect(Set1, Set2, Int)
は集合Set1
とSet2
の積Int
(積集合となる) を返す.
ふむ.Java でいうと... ないかも.JGL なら SetOperations#setIntersection()
みたいな.
モード
intersect(+, +, -).
ふむ.二つの集合は共に与えないといけないらしい.
そして第 3 引数に具体的なリストを与えて,それが第 1・第 2 引数で与えた集合の積集合かどうかをテストすることはできないのですね.
まぁ,集合とはいっても所詮はリストですからね.要素の順序が違ってもテストできるというとちょっと大変かも.
定義
では,こいつの定義を写経しませう.
intersect([], _, []). intersect([X|Set1], Set2, [X|Int]) :- element(X, Set2), !, intersect(Set1, Set2, Int). intersect([_|Set1], Set2, Int) :- intersect(Set1, Set2, Int).
ふむ.
最初の節は停止条件なのでスルーして,2 番目の節では第 1 引数で与えられたリストの最初の要素 X
が第2引数で与えられた集合の要素であれば,第 1 引数で与えられた集合の 2 番目以降の要素からなる集合と第 2 引数で与えられた集合の積集合にXを加えたものが結果ですよ,と.
そして第 1 引数で与えられたリストの最初の要素が第2引数で与えられた集合の要素でなければ,第 1 引数で与えられた集合の 2 番目以降の要素からなる集合と第 2 引数で与えられた集合の積集合が結果ですよ,と.
ふむふむふむ.
例
では使用例を写経しませう.
2 ?- intersect([i, j, k, l, m], [n, m, l, k], X). X = [k, l, m] Yes 3 ?- intersect([n, m, l, k], [i, j, k, l, m], Y). Y = [m, l, k] Yes 4 ?- intersect([n, m, l, k], [], Z). Z = [] Yes
ふむ.
またしても特にどうということもない感じ.