Prolog 写経記 その 36 difference/3
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
difference/3
を写経します.解説
difference(Set1, Set2, Diff)
は 2 つの集合Set1
とSet2
の違いDiff
(差集合となる) を返す.
ふむ.Java でいうと... 副作用があるけど Set#removeAll(Collection)
みたいな.
モード
difference(+, +, -).
ふむ.二つの集合は共に与えないといけないらしい.
定義
では,こいつの定義を写経しませう.
difference([], _, []). difference([X | Set1], Set2, Diff) :- element(X, Set2), !, difference(Set1, Set2, Diff). difference([X | Set1], Set2, [X | Diff]) :- difference(Set1, Set2, Diff).
未知の述語 element/2
が使われています.次ページに出てくるのですが,とりあえず今は無視.
その element/2
が2番目と3番目の節のどちらを選択するかの条件になっていますね.element/3
の後にカットが付いているのはそのため.
んで,X
が Set2
の要素なら残りの要素からなる集合と Set2
の差集合が結果だし,X
が Set2
の要素でなければ残りの要素からなる集合と Set2
の差集合に X
を加えた集合が結果ですよ,と.
ふむ.
注記
この述語は可換的でないため
difference(Set1, Set2, Diff1)
とdifference(Set2, Set1, Diff2)
は異なった結果を返す.
らじゃあ.
例
では使用例を写経しませう.
5 ?- difference([2, 4, 5, 8], [1, 3, 4, 5, 9], X). X = [2, 8] Yes 6 ?- difference([1, 3, 4, 5, 9], [2, 4, 5, 8], Y). Y = [1, 3, 9] Yes
ふむ.
特にどうという事もない感じ.