Prolog 写経記 その 43 subset/2
(ほぼ) 毎日淡々と Prolog を写経します.元ネタはこちら.
- 作者: ボグダンフィリピッチ,中島誠,伊藤哲郎
- 出版社/メーカー: 海文堂出版
- 発売日: 1990/08
- メディア: 単行本
- 購入: 4人 クリック: 33回
- この商品を含むブログ (68件) を見る
subset/2
を写経します.解説
subset(SubSet, Set)
は集合SubSet
中の任意の要素が集合Set
の要素であるとき成功する.
ふむ.Java でいうと... Set#containsAll(Collection)
みたいな.
モード
subset(+, +).
ふむ.集合操作は +
が多いですね.
定義
では,こいつの定義を写経しませう.
subset([], _). subset([X | Sub], Set) :- element(X, Set), subset(Sub, Set).
ふむ.
最初の節は停止条件なのでスルーして,2 番目の節.
第 1 引数で渡された集合を最初の要素 X
と残りの要素からなる集合 Sub
に分けて,X
が第 2 引数で渡された集合 Set
の要素でかつ,Sub
が Set
の部分集合なら真ということですね.
普通っぽい.
注記
subset/2
リスト処理述語sublist/2
を比較してみよ.
らじゃあ.
sublist(Sub, List) :- conc(S, _, List), conc(_, Sub, S), !.
おっとぉ,全然違っていますね.
これは,リストが順序を持っているのに対して集合には順序がないからですね.
それにしても sublist/2
の定義すごいなぁ.
例
では使用例を写経しませう.
8 ?- subset([f, c, d], [d, a, f, e, c, b]). Yes 9 ?- subset([f, c, g], [d, a, f, e, c, b]). No 10 ?- subset([], [6, 8, 4, 5, 7]). Yes 11 ?- subset([6, 8, 4, 5, 7], []). No
ふむ.特にどうという事もなく.