Prologではリストを使えば、不定個の要素に構造を持たせて、色々な処理を実装することができます。
[項1,項2,・・・,項n]
[ぶどう,りんご,いちご] ・・・果物のリスト
[1,2,3,4,5] ・・・数字のリスト
リストは、入れ子も可能です。
[[項1],項2,[項3,項4]]
リストは|(縦棒)を使用し、頭部と尾部に分ける事ができます。
?- [a,b,c,d] = [A | B].
A = a,
B = [b,c,d]
?- [a,b,c,d] = [A,B |C].
A = a,
B = b,
C = [c,d]
リストを使ってみよう
test:-
L=[1,2,3,4,5],func(L).
func([]):-!.
func([A|L]):-
write(A),nl,
func(L).
?-test.
1
2
3
4
5
yes
test述語では、Lという変数に[1,2,3,4,5]のリストをユニフィケーションし、
Lという変数をfunc述語にアリティとして渡してます。
func述語は2つ定義しました。
まず一つ目の「func([])]は終了条件になります。
[]は空リストと呼ばれ、要素がないリストです。
次の2つ目のfunc述語では、渡されたリストの頭部と尾部を分解し、頭部をwrite述語で出力した後、
尾部を、func述語に渡し、再帰処理をしてます。
func述語では要素がある限り、2つ目の述語が実行され、要素が空になる(空リストになる)と
再帰処理を終了してます。
回帰のイメージ
回帰は一周して元に戻る
再帰のイメージ
再帰もグルっと回って元に戻ってくるが、戻ってきた時に決まってなかった値(変数など)が決まって元に戻る。
黒丸のところに何らかかのプログラムを記述する。
test:-
L=[1,2,3,4,5],func(L,M),write(M).
func([],[]):-!.
func([A|L],[A|S]):-func(L,S).
?-test.
[1,2,3,4,5]yes
test述語では、Lという変数に[1,2,3,4,5]のリストをユニフィケーションし、
Lという変数をfunc述語に第一アリティとして渡してます。
そして、func述語の第二アリティはLのリストがコピーされた値が
Mにユニフィケーションされ、write述語でMを出力してます。
func述語は2つ定義してます。
一つ目の「func([],[])]は、先ほどと同様に終了条件になります。
2つ目のfunc述語では、渡されたリストの頭部と尾部を分解し、頭部を第二アリティのリストの
先頭へ追加してます。
尾部は、func述語の第一アリティへ、また欲しい答えを第二アリティへ渡し、再帰処理を
行ってます。
※ここではまだ第二アリティの値は未知。
第一アリティの要素がある限り、2つ目のfunc述語が実行され、都度、第二アリティの先頭へ
追加し、第一アリティが空リストになれば、第二アリティも空であると定義された
一つ目のfunc述語が実行され、終了します。
test:-
N=10,func(N).
func(0):-!.
func(N):-
write('HELLO'),nl,
X is N-1,
func(X).
test述語では、Nという変数に10を数値をユニフィケーションし、
Nという変数をfunc述語に第一アリティとして渡してます。
func述語は2つ定義してます。
一つ目の「func(0]はNの値が0の場合、終了する条件です。
※Prologで、述語を定義する場合、この終了条件を定義する意識をもつ必要があります。
2つ目のfunc述語では、write述語で、HELLOという文字列を出力し、Nから1をマイナス後にfunc述語へ渡してます。
つまり、Nの値が0になるまで、「HELLO]を出力してます。
まとめ
今回は以下の事を学習しました。
最終更新:2014年05月08日 11:00