リストの使い方

  • リストについて
  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述語が実行され、終了します。

  • forループを作る
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