Prolog 写経記 その 29 split_n/4

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

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

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

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

解説

split_n(N, List, List1, List2)ListN 番目の要素が List2 の先頭の要素になるようListを List1List2 の 2 つの部分リストに分割する.

ふむ.

モード

split_n(?, +, ?, ?)

ふむふむ.

定義

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

split_n(N, List, List1, List2) :-
	conc(List1, List2, List),
	length(List1, L),
	N is L + 1.

ふむふむふむ.
リストの分割といえば conc/3 のお世話になるのがお約束.
List1List2 をくっつけたのが List で,List1 の長さに 1 加えたのが N だよ,と.
length(List1, L)N is L + 1 の順番重要.逆だと引数で N を具体化しなかった場合にぐはぁっ.

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

2 ?- split_n(4, [a, b, c, d], L1, L2).

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

Yes
3 ?- split_n(P, [a, b, c, d], [a, b], [c, d]).

P = 3 

Yes
4 ?- split_n(_, [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] ;

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

No

ふむふむふむふむ.
特にどうという事もない... よね.
なんか手抜きっぽいけどこんなもんだ.