Prolog 写経記 その 38 equal_sets/2

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

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

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

今日は equal_sets/2 を写経します.

解説

equal_sets(Set1, Set2) は集合 Set1Set2 とが同じ要素を含んでいる場合,成功する.

ふむ.Java でいうと普通に Set#equals(Object) みたいな.

モード

equal_sets(+, +).

ふむ.二つの集合は共に与えないといけないらしい.

定義

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

equal_sets(Set1, Set2) :-
	difference(Set1, Set2, []),
	difference(Set2, Set1, []).

うひゃー.こう来たか.
Set1 にあって Set2 にないもの,Set2 にあって Set1 にないもの,どちらもなければ Set1Set2 は同じだよ,と.
確かにそうだけど,もしかしたら自然なのかもしれないけれど,なかなかこういう発想は出てこないなぁ.
こういうのをスラスラ思いつくようになるにはどないしたらよかとですか?

注記

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

ふむ.
またしても特にどうということもない感じ.