Prolog 写経記 その 27 split/4

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

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

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

今日は split/4 を写経します.

解説

split(X, List, List1, List2)List2 の最初の要素が X になるよう ListList1List2 の 2 つの部分リストに分割する.

ふむ.Java でいうと... そのまんまはないような...

モード

split(?, ?, ?, ?)

お,久しぶりに全部入出力どっちでも可.
といっても,全ての変数を具体化しないで呼び出せるわけではないと思いますが.

定義

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

split(X, List, List1, List2) :-
	conc(List1, [X | L], List),
	conc([X], L, List2).

...
またこのパターンかぁ.
いったい何度目になるんだろう?
ともあれ (JW),ListX とその左にある要素のリスト(List1)と右にある要素のリスト(L)の3つに分けて以下同文,見たいな.
まぁ,見慣れたからといって使えるようになったとは言えませんが.

注記

split/4List1 と空でない List2 を結合するために用いてもよい (3番目の例参照).

らじゃあ.

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

3 ?- split(b, [a, b, c, d], L1, L2).

L1 = [a]
L2 = [b, c, d] 

Yes
4 ?- split(_, [a, b, c, d], L1, L2).

L1 = []
L2 = [a, b, c, d] ;

L1 = [a]
L2 = [b, c, d] ;

L1 = [a, b]
L2 = [c, d] ;

L1 = [a, b, c]
L2 = [d] ;

No
5 ?- split(_, X, [3, 8, 1, 5], [2, 4, 1]).

X = [3, 8, 1, 5, 2, 4, 1] 

Yes
6 ?- split(_, L, [a1, a2], []).

No

ふむ.
まぁ,どうという事もない感じ.