Prolog 写経記 その 38 equal_sets/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
equal_sets/2
を写経します.解説
equal_sets(Set1, Set2)
は集合Set1
とSet2
とが同じ要素を含んでいる場合,成功する.
ふむ.Java でいうと普通に Set#equals(Object)
みたいな.
モード
equal_sets(+, +).
ふむ.二つの集合は共に与えないといけないらしい.
定義
では,こいつの定義を写経しませう.
equal_sets(Set1, Set2) :- difference(Set1, Set2, []), difference(Set2, Set1, []).
うひゃー.こう来たか.
Set1
にあって Set2
にないもの,Set2
にあって Set1
にないもの,どちらもなければ Set1
と Set2
は同じだよ,と.
確かにそうだけど,もしかしたら自然なのかもしれないけれど,なかなかこういう発想は出てこないなぁ.
こういうのをスラスラ思いつくようになるにはどないしたらよかとですか?
注記
equal_sets/2
は,同一の集合であってもリスト表現では要素の順序が異なってしまうことがあるめに必要となる.Prolog の項としてのこの種のリストの同一性検査は失敗するため,集合の同一性を調べるときには述語equal_sets
を用いること.
らじゃあ.
例
では使用例を写経しませう.
2 ?- equal_sets([a, d, e, c], [c, a, e, d]). Yes 3 ?- equal_sets([3, 1, 8, 4, 6], [6, 8, 1, 5, 4]). No 4 ?- equal_sets([], []). Yes
ふむ.
またしても特にどうということもない感じ.