このページではJavaScriptを使用しています。

サンプルコード

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の後ろにBを挿入する
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]).