このページでは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]).