AZ-Prolog ユーザーズマニュアル

#### サンプルコード

### s_utility.pl 基本的なリスト処理
(コメントになっている同名の述語は非効率の見本です)

1.リストの先頭の要素を求める
public car/2.
実行例
    | ?-car(A,[a,b,c,d]).
    A       = a
    yes
プログラム
    car(A,[A|_]).

    %% car(A,L):-
    %%	[A|_]=L.

2.リストの先頭以外の要素を求める
public cdr/2.
実行例
    | ?-cdr(A,[a,b,c,d]).
    A       = [b,c,d]
    yes
プログラム
    cdr(A,[_|A]).

    %% cdr(A,L):-
    %%	[_|A]=L.

3.リストの先頭に要素を追加する
public cons/3.
実行例
    | ?-cons(a,[b,c,d],A).
    A       = [a,b,c,d]
    yes
プログラム
    cons(A,B,[A|B]).

4.リストの二番目の要素を求める
public second/2.
実行例
    | ?-second(A,[a,b,c,d]).
    A       = b
    yes
プログラム
    second(A,[_,A|_]).

    %% second(A,L):-
    %%	cdr(C,L),
    %%	car(A,C).
    %% second1(A,L):-
    %%	car(A,C),
    %%	cdr(C,L).

5.リストの内容を出力する
public write_list/1.
実行例
    | ?-write_list([a,b,c,d]).
    abcd
    yes
プログラム
    write_list([]).
    write_list([A|L]):-
    	write(A),
    	write_list(L).

6.リストの要素を取り出す/リストの要素か調べる
public my_member/2.
実行例
    | ?-my_member(b,[a,b,c,d]).
    yes

    | ?-my_member(e,[a,b,c,d]).
    no
プログラム
    my_member(A,[A|_]).
    my_member(A,[_|L]):-
    	my_member(A,L).

7.リストの最後の要素を取り出す
public last/2.
実行例
    | ?-last([a,b,c,d],A).
    A       = d
    yes
プログラム
    last([A],A).
    last([_|L],A):-
    	last(L,A).

8.リストの内容を加算する
public add_all/2.
実行例
    | ?-add_all([1,2,3,4,5],N).
    N       = 15
    yes
プログラム
    add_all(A,N):-
    	add_all(A,0,N).
    add_all([],N,N).
    add_all([A|L],M,N):-
    	MM is M+A,
    	add_all(L,MM,N).

    %% add_all([],0).
    %% add_all([A|L],N):-
    %%	add_all(L,M),
    %%	N is M+A.cons(A,B,[A|B]).

9.リストの指定の位置の要素を取り出す
public nth/3.
実行例
    | ?-nth(3,A,[a,b,c,d,e]).
    A       = c
    yes
プログラム
    nth(1,A,[A|_]).
    nth(N,A,[_|L]):-
    	M is N-1,
    	nth(M,A,L).

10.リストから1要素とそれ以外を取り出す
public select/3.
実行例
    | ?-select([a,b,c,d,e],b,L).
    L       = [a,c,d,e]
    yes
プログラム
    select([A|L],A,L).
    select([B|L],A,[B|R]):-
    	select(L,A,R).

11.連想ペアリストの検索
public assoc/3.
実行例
    | ?-assoc(a,B,[[a,d,e,f],[s,t,u]]).
    B       = [d,e,f]
    yes
プログラム
    assoc(A,B,[[A|B]|_]).
    assoc(A,B,[_|L]):-
    	assoc(A,B,L).

12.リストの同一要素の削除する
public pack/2.
実行例
    | ?-pack([a,b,c,b,d,e],R).
    R       = [a,c,b,d,e]
    yes
プログラム
    pack([],[]).
    pack([A|L],R):-
    	member(A,L),
    	pack(L,R).
    pack([A|L],[A|R]):-
    	pack(L,R).

13.リストを指定位置で分割する
public divide/4.
実行例
    | ?-divide(3,[a,b,c,d,e],Y,Z).
    Y       = [a,b,c],
    Z       = [d,e]
    yes
プログラム
    divide(0,L,[],L).
    divide(N,[A|L],[A|R],T):-
    	N>0,
    	M is N-1,
    	divide(M,L,R,T).

14.リストを指定の要素位置で分割する
public divide_at/4.
実行例
    | ?-divide_at(c,[a,b,c,d,e,f],Y,Z).
    Y       = [a,b],
    Z       = [c,d,e,f]
    yes
プログラム
    divide_at(A,[A|L],[],[A|L]).
    divide_at(A,[B|L],[B|R],T):-
    	divide_at(A,L,R,T).

15.指定の要素を削除する
public delete/3.
実行例
    | ?-delete(c,[a,b,c,d,e,f],R).
    R       = [a,b,d,e,f]
    yes
プログラム
    delete(_,[],[]).
    delete(A,[A|L],R):-
    	delete(A,L,R).
    delete(A,[B|L],[B|R]):-
    	delete(A,L,R).

16.指定の位置の要素を削除する
public delete_nth/3.
実行例
    | ?-delete_nth(3,[a,b,c,d,e,f],Z).
    Z       = [a,b,d,e,f]
    yes
プログラム
    delete_nth(1,[_|L],L).
    delete_nth(N,[A|L],[A|R]):-
    	M is N-1,
    	delete_nth(M,L,R).

17.リストの指定の位置に挿入する
public insert/4.
実行例
    | ?-insert(3,w,[a,b,c,d,e,f],Z).
    Z       = [a,b,w,c,d,e,f]
    yes
プログラム
    insert(1,A,L,[A|L]).
    insert(N,A,[B|L],[B|R]):-
    	N>0,
    	M is N-1,
    	insert(M,A,L,R).

18.リストのAの後ろにＢを挿入する
public insert_after/4.
実行例
    | ?-insert_after(c,a,[b,c,d,e,f],Z).
    Z       = [b,c,a,d,e,f]
    yes
プログラム
    insert_after(A,B,[A|L],[A,B|L]).
    insert_after(A,B,[C|L],[C|R]):-
    	insert_after(A,B,L,R).

19.リストの長さを求める
public list_length/2.
実行例
    | ?-list_length([a,b,c,d,e,f],N).
    N       = 6
    yes
プログラム
    list_length(L,N):-
    	list_length(L,0,N).
    list_length([],N,N).
    list_length([_|L],N,M):-
    	NN is N+1,
    	list_length(L,NN,M).

    %% list_length([],0).
    %% list_length([_|L],N):-
    %%	list_length(L,M),
    %%	N is M+1.

20.リストの結合
public my_append/3.
実行例
    | ?-my_append([a,b,c],[d,e,f],Z).
    Z       = [a,b,c,d,e,f]
    yes
プログラム
    my_append([],L,L).
    my_append([A|L],R,[A|LR]):-
    	my_append(L,R,LR).

21.リストの反転
public reverse/2.
実行例
    | ?-reverse([a,b,c,d,e],R).
    R       = [e,d,c,b,a]
    yes
プログラム
    reverse(L,R):-
    	rev(L,[],R).
    rev([],L,L).
    rev([A|L],R,ANS):-
    	rev(L,[A|R],ANS).

    %% reverse([],[]).
    %% reverse([A|L],R):-
    %%	reverse(L,K),
    %%	append(K,[A],R).

21.リストの中のリストの結合
public appends/2.
実行例
    | ?-appends([[a,b,c],[d,e,f]],Z).
    Z       = [a,b,c,d,e,f]
    yes
プログラム
    appends([],[]):- !.
    appends([[]|L],R):-
    	!,
    	appends(L,R).
    appends([[X|L]|LL],[X|LR]):-
    	appends([L|LL],LR).

    %% appends([],[]).
    %% appends([X|L],X1):-
    %%	append(X,Y,X1),
    %%	appends(L,Y).

    %% appends([],[]).
    %% appends([X|L],X1):-
    %%	appends(L,Y),
    %%	append(X,Y,X1).

21.リストの中のリストの反転
public reverses/2.
実行例
    | ?-reverses([[a,b,c,d,e]],R).
    R       = [[e,d,c,b,a]]
    yes
プログラム
    reverses(L,R):-reverses(L,[],R).
    reverses([],_,[]).
    reverses([[]|L],R,[R|X]):-
    	reverses(L,[],X).
    reverses([[A|S]|L],R,X):-
    	reverses([S|L],[A|R],X).

    %% reverses([],[]).
    %% reverses([A|L],[B|R]):-
    %%	reverse(A,B),
    %%	reverses(L,R).

24.3リストの結合
public append3/4.
実行例
    | ?-append3([a,b],[c,d],[e,f],ABC).
    ABC     = [a,b,c,d,e,f]
    yes
プログラム
    append3(A,B,C,ABC):-
    	append(A,BC,ABC),
    	append(B,C,BC).

    %% append3(A,B,C,ABC):-
    %%	append(B,C,BC),
    %%	append(A,BC,ABC).

25.リストの平坦化
public flat/2.
実行例
    | ?-flat([a,[b,[c],d],[e,f]],B).
    B       = [a,b,c,d,e,f]
    yes
プログラム
    flat(A,B):-flat(A,[],B),!.
    flat([],X,X).
    flat([A|L],R,ANS):-
    	flat(A,X,ANS),
    	flat(L,R,X).
    flat(A,X,[A|X]).

    %% flat([],[]).
    %% flat([A|L],ANS):-
    %% 	flat(A,AF),
    %%	flat(L,LF),
    %%	append(AF,LF,ANS).
    %% flat(A,[A]).

▲