「リストの使い方」の編集履歴(バックアップ)一覧はこちら
「リストの使い方」(2014/05/08 (木) 11:00:41) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
-リストについて
Prologではリストを使えば、不定個の要素に構造を持たせて、色々な処理を実装することができます。
-構造
[項1,項2,・・・,項n]
-例
[ぶどう,りんご,いちご] ・・・果物のリスト
[1,2,3,4,5] ・・・数字のリスト
リストは、入れ子も可能です。
[[項1],項2,[項3,項4]]
-リストの分解
リストは&bold(){|(縦棒)}を使用し、頭部と尾部に分ける事ができます。
-例
?- [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つ目の述語が実行され、要素が空になる(空リストになる)と
再帰処理を終了してます。
回帰のイメージ
回帰は一周して元に戻る
#image(http://cdn46.atwikiimg.com/az-prolog/?cmd=upload&act=open&page=%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9&file=6.png)
再帰のイメージ
再帰もグルっと回って元に戻ってくるが、戻ってきた時に決まってなかった値(変数など)が決まって元に戻る。
黒丸のところに何らかかのプログラムを記述する。
-リストのコピー
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で、述語を定義する場合、この&bold(){終了条件}を定義する意識をもつ必要があります。
2つ目のfunc述語では、write述語で、HELLOという文字列を出力し、Nから1をマイナス後にfunc述語へ渡してます。
つまり、Nの値が0になるまで、「HELLO]を出力してます。
----
***まとめ
今回は以下の事を学習しました。
・リストの構造について
・リストの使用例
・再帰処理
-リストについて
Prologではリストを使えば、不定個の要素に構造を持たせて、色々な処理を実装することができます。
-構造
[項1,項2,・・・,項n]
-例
[ぶどう,りんご,いちご] ・・・果物のリスト
[1,2,3,4,5] ・・・数字のリスト
リストは、入れ子も可能です。
[[項1],項2,[項3,項4]]
-リストの分解
リストは&bold(){|(縦棒)}を使用し、頭部と尾部に分ける事ができます。
-例
?- [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つ目の述語が実行され、要素が空になる(空リストになる)と
再帰処理を終了してます。
回帰のイメージ
回帰は一周して元に戻る
#image(http://cdn46.atwikiimg.com/az-prolog/?cmd=upload&act=open&page=%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9&file=6.png)
再帰のイメージ
再帰もグルっと回って元に戻ってくるが、戻ってきた時に決まってなかった値(変数など)が決まって元に戻る。
黒丸のところに何らかかのプログラムを記述する。
#image(http://cdn46.atwikiimg.com/az-prolog/?cmd=upload&act=open&page=%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9&file=8.png)
-リストのコピー
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で、述語を定義する場合、この&bold(){終了条件}を定義する意識をもつ必要があります。
2つ目のfunc述語では、write述語で、HELLOという文字列を出力し、Nから1をマイナス後にfunc述語へ渡してます。
つまり、Nの値が0になるまで、「HELLO]を出力してます。
----
***まとめ
今回は以下の事を学習しました。
・リストの構造について
・リストの使用例
・再帰処理