Prolog 写経記 その 30 sublist/2

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

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

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

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

解説

sublist(Sub, List)SubList の部分リストであれば成功する.

ふむ.Java でいうと... List#sublist(int, int)... はちょっと違うな.
String#contaians(CharSequence) の方が近い感じ.

モード

sublist(+, +).

ふーん.第 1 引数を変数にしちゃダメなんだぁ.

定義

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

sublist(Sub, List) :-
	conc(S, _, List),
	conc(_, Sub, S), !.

まぁ,例によって例のごとく.
分けるのとくっつけるのは同じ事,みたいな.
最後にカットが付いてますね.これだとバックトラックが効かないから,引数に変数を渡すのはやっぱりダメって事ですか.

注記

部分リストの要素は,元のリストでの順序と同じ順序で並べられていなければならない.

らじゃあ.subset じゃなくて sublist だもんね.あるいは subsequence みたいな.

では使用例を写経しませう.

3 ?- sublist([l, m], [i, j, k, l, m, n]).

Yes
4 ?- sublist([a*b, c*d], [a*b, b*c, c*d]).

No
5 ?- sublist([], []).

Yes

ふむ.


念のため,第1引数に変数を渡してみます.

6 ?- sublist(S, [i, j, k, l, m, n]).

S = [] ;

No

やはり.カットが効いちゃってますね.
まぁ,よかろう.
っていうか,今日も手抜きっぽいなぁ.
簡単なやつはそろそろ日記ではスキップするとかした方がいいかも?