リストの使い方

「リストの使い方」の編集履歴(バックアップ)一覧はこちら

リストの使い方」(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]を出力してます。 ---- ***まとめ 今回は以下の事を学習しました。 ・リストの構造について ・リストの使用例 ・再帰処理

表示オプション

横に並べて表示:
変化行の前後のみ表示: