このディレクトリの索引
#  
#  リストをある要素で、複数のリストに分割するsplit/3を実装せよ。
#  

split(L1,_区切り文字,L2) :-
        findall(X,(
                    非決定性split(L1,_区切り文字,X)),
                L2).

非決定性split(L,_区切り文字,X) :-
        最初に区切り文字が出現するまでの部分も対象(L,_区切り文字,X).
非決定性split(L,_区切り文字,X) :-
        区切り文字と区切り文字に囲まれた部分(L,_区切り文字,X).
非決定性split(L,_区切り文字,X) :-
        最後の要素は残り要素に区切り文字が出現しない(L,_区切り文字,X).
非決定性split(L,_区切り文字,L) :-
        リストのなかに区切り文字が存在しないときは(L,_区切り文字).

最初に区切り文字が出現するまでの部分も対象(L,_区切り文字,X) :-
        append(X,[_区切り文字|_],L),
        \+(member(_区切り文字,X)).

区切り文字と区切り文字に囲まれた部分(L,_区切り文字,X) :-
        append(_,[_区切り文字|X],[_区切り文字|_],L),
        \+(member(_区切り文字,X)).

最後の要素は残り要素に区切り文字が出現しない(L,_区切り文字,X) :-
        append(L0,[_区切り文字|X],L),
        \+(member(_区切り文字,X)).

リストの中に区切り文字が存在しないときは(L,_区切り文字) :-
        \+(member(_区切り文字,L)).

append([],L1,L2,L) :-
        append(L1,L2,L).
append([A|R1],L1,L2,[A|R]) :-
        append(R1,L1,L2,R).