1.リストの先頭の要素を求める |
public car/2. |
実行例 |
| ?-car(A,[a,b,c,d]). |
プログラム |
car(A,[A|_]). %% car(A,L):- %% [A|_]=L. |
2.リストの先頭以外の要素を求める |
public cdr/2. |
実行例 |
| ?-cdr(A,[a,b,c,d]). |
プログラム |
cdr(A,[_|A]). %% cdr(A,L):- %% [_|A]=L. |
3.リストの先頭に要素を追加する |
public cons/3. |
実行例 |
| ?-cons(a,[b,c,d],A). |
プログラム |
cons(A,B,[A|B]). |
4.リストの二番目の要素を求める |
public second/2. |
実行例 |
| ?-second(A,[a,b,c,d]). |
プログラム |
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]). |
プログラム |
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). |
プログラム |
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]). |
プログラム |
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). |
プログラム |
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). |
プログラム |
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). |
プログラム |
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). |
プログラム |
delete_nth(1,[_|L],L). |
17.リストの指定の位置に挿入する |
public insert/4. |
実行例 |
| ?-insert(3,w,[a,b,c,d,e,f],Z). |
プログラム |
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). |
プログラム |
insert_after(A,B,[A|L],[A,B|L]). |
19.リストの長さを求める |
public list_length/2. |
実行例 |
| ?-list_length([a,b,c,d,e,f],N). |
プログラム |
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). |
プログラム |
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). |
プログラム |
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). |
プログラム |
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). |
プログラム |
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]). |