プログラミング言語論 第8回 LISP 担当:犬塚.

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
人工知能特論2011 No.4 東京工科大学大学院 担当教員:亀田弘之.
人工知能特論2007 No.4 東京工科大学大学院 担当教員:亀田弘之.
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラムのパタン演習 解説.
プログラミング言語論 関数型プログラミング言語 水野嘉明
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
プログラミング言語としてのR 情報知能学科 白井 英俊.
ISD実習E 2009年7月13日 LISPシステム入門 (第6回) 関数の定義 eval load 関数.
計算の理論 II 帰納的関数(つづき) 月曜4校時 大月美佳.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
Debianにおける Common Lispプログラミング環境
プログラミングパラダイム さまざまな計算のモデルにもとづく、 プログラミングの方法論 手続き型 関数型 オブジェクト指向 代数 幾何.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
5.チューリングマシンと計算.
5.チューリングマシンと計算.
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
情報工学概論 (アルゴリズムとデータ構造)
プログラミング言語論 第4回 式の構文、式の評価
条件式 (Conditional Expressions)
Tokuda Lab. NISHIMURA Taichi
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
プログラミング言語入門 手続き型言語としてのJava
プログラミング2 関数
PROGRAMMING IN HASKELL
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 D1 平石 拓 2005/10/18
プログラミング演習I 2003年5月7日(第4回) 木村巌.
第2回 状態モデルと 命令型言語(1) 担当:犬塚
4.リスト,シンボル,文字列.
情報処理Ⅱ 第2回:2003年10月14日(火).
C言語 はじめに 2016年 吉田研究室.
15.cons と種々のデータ構造.
5.チューリングマシンと計算.
第14回 前半:ラムダ計算(演習付) 後半:小テスト
数理論理学 第9回 茨城大学工学部情報工学科 佐々木 稔.
執筆者:難波和明 授業者:寺尾 敦 atsushi [at] si.aoyama.ac.jp
プログラミング言語論 第10回 情報工学科 篠埜 功.
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
情報処理Ⅱ 第7回 2004年11月16日(火).
~sumii/class/proenb2009/ml6/
情報処理Ⅱ 2005年10月28日(金).
PROGRAMMING IN HASKELL
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
~sumii/class/proenb2010/ml5/
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2010年6月17日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

プログラミング言語論 第8回 LISP 担当:犬塚

今日の講義 LISP入門 リスト構造とリストの操作 基本演算 基本的な制御構造 純粋関数型に反する機能 LISPは非常に多数の方言があるが、common lispとして統一規格が出て以来、これが主流。

LISPのデータ 変数ではなくデータ(オブジェクト)に型がある。 (実際には効率等の面から変数にも型を与えられる)  (実際には効率等の面から変数にも型を与えられる) LISPのデータ型:表現によって決まる。 数型(整数型、分数型、浮動小数点数型、複素数型) 文字型 #\a #\newline シンボル型 abc (=aBc) コンス型 関数型 その他 コンス以外をアトムという。

リスト LISPのリストは ( )で要素を括った形式、 要素は空白で区切る。 要素にはLISPのどんなデータも入れることができる。 ( )で要素を括った形式、 要素は空白で区切る。 要素にはLISPのどんなデータも入れることができる。 リスト自身を要素としてもよい。 例 (1 2 3 4) (a (b c) d (e (f))) 空リストは、 () あるいは nil と表す。 リストは用途は決まっていない。好きにデータ構造を表せる。 例 (taro (fullname suzuki taro) (hight 172) (weight 67))

リストの基本演算 car, cdr, cons LISPの基本演算に car, cdr cons がある。 car(カー), cdr(クダー)は当時の計算機のレジスタに由来する名称、cons(コンス)はconstruction。  (car ’(a b c d)) → a : 先頭要素を返す  (cdr ’(a b c d)) → (b c d) : 先頭要素を取り除いたリストを返す  (cons ’a ’(b c d)) → (a b c d) : 第2引数のリストの先頭要素として、第1引数の要素   を加えたリストを返す。

car, cdr の組合わせ 2つ目の要素を取り出すには、 (car (cdr ’(a b c d))) → b 1つ目の要素であるリストの第2要素は、 (car (cdr (car ’((a b) c d)))) → b こうした演算はよく使うので、省略形がある: (cadr ’(a b c d)) → b    カードゥル  (cadar ’((a b) c d)) → b カダール cとrの間にa,dを適当に並べるとこれらの演算を意味する  (たいてい4つ程度までサポート)

練習 以下の式のopに適切にリスト演算を入れて、aからeの各記号が答えになるようにせよ。 (op ’(a ((b) c) (d (e))))

リストは連結リスト LISPのリストは連結リストで構成されている。 (a b c d e) (a ((b) c)) a b c d a b

コンス、点対 x y 例 (cons ’a (cons ’b (cons ’c nil))) LISPでは をセルまたはコンスという。 (cons x y) でコンスが1つ作られる。 コンスの左をたどるのがcar, 右をたどるのがcdr。 consによってリストを表現できる。 例 (cons ’a (cons ’b (cons ’c nil))) → (a b c) (cons ’a (cons (cons (cons ’b nil) (cons ’c nil)) nil)) → (a ((b) c)) c x y

コンス、点対 コンスを中置の「.」で表す形式もある。 (cons x y) = (x . y) この形式を点対(dot pair)という。 ’(a . (b . (c . nil))) → (a b c) ’(a . (((b . nil) . (c . nil)) . nil)) → (a ((b) c)) この形式を点対(dot pair)という。 最後がnilでないリストは点対で表す。 ’(a . (b . (c . d))) → (a b c . d)

練習 アトム(aや1のように記号のみからなるデータ)からcons を用いて、次のリストを作れ。また点対で表現せよ。 ① (a (b) c) ② (1 (2 (3 (4 . 5))))

LISPの基本的制御構造 マッカーシーの条件式 (cond (条件 値) …(条件 値)) 左から順に調べ最初に真となったときの値が返る。  真となるものがない場合はnil。 条件には任意の式が使える。式が値nilのとき偽、それ以外では真を表す。 条件に用いる関数=述語:末尾にpがつくものが多い。 (zerop x) xがゼロであれば真。 (null x) xが空リストのとき真。 t いつも真であることを表す定数に束縛されている。

condを用いたプログラム例 例 つぎの関数absは絶対値を求める。 (defun myabs (x) (cond ((plusp x) x) ; x>0 なら x (t (* x -1) ; それ以外は -x   )) 再帰的な定義と組合わせると多様な関数が定義できる。   (defun fact (x) (cond ((zerop x) 1) (t (* x (fact (- x 1))))

再帰定義を用いたリスト操作 再帰によるリスト操作はLISPの基本的技法である。 リストXとYの連結(append)は次のように書ける。 )) (defun myappend (x y) (cond ((null x) y) (t (cons (car x) (myappend (cdr x) y))) )) (myappend ’(1 2 3) ’(4 5 6)) → (1 2 3 4 5 6)

Myappendのトレース 実行例: (defun myappend (x y) (cond ((null x) y) (t (cons (car x) (myappend (cdr x) y))))) 実行例: (myappend ’(a b c) ’(d e f)) (null ’(a b c))は偽 → (cons ’a (myappend ’(b c) ’(d e f))) (myappend ’(b c) ’(d e f)) (null ’(b c))は偽 → (cons ’b (myappend ’(c) ’(d e f))) (myappend ’(c) ’(d e f)) (null ’(c))は偽 → (cons ’c (myappend ’() ’(d e f))) (myappend ’() ’(d e f)) (null ’())は真 → ’(d e f) (cons ’c (myappend ’() ’(d e f)))=(cons ’c ’(d e f))=(c d e f)   (cons ’b (myappend ’(c) ’(d e f)))=(cons ’b ’(c d e f))=(b c d e f)   (cons ’a (myappend ’(b c) ’(d e f)))=(cons ’a ’(b c d e f))=(a b c d e f)  

練習 次のリスト操作関数を定義せよ リストxの最後の要素を取り出す (mylast x) 数のリストxの要素の合計得る (mysum x)

LISPの関数呼出しと関数定義 関数適用は、前置き表現で行われる。 (関数 値 値 …) (関数 値 値 …)  LISPは値には型があるので、関数を適用する際に型違反であれば、エラーとなる。 関数定義は次の形式で定義される。 (defun 関数名 (x y …) 関数本体) 例 (defun myplus (x y) (+ x y))

LISPの関数呼出しとクォート LISPの式は、すべてリスト形式で表される。 すると、(a b c d)としたとき次のものが区別できない。 4つの要素からなるリスト 関数aに対するb c dの適用する b c dもシンボルそのものか、その値か、 オブジェクトxを評価せず、そのままのデータとしたいとき (quote x) とかく。’x はその省略記法。 したがって、 (a b c d)とかけば、関数aに変数b c dの値を適用。 (a ’b ’c ’d)とかけば、関数aにシンボルb c dを渡す。 ’(a b c d)と単にリスト。

その他の制御構造 関数定義において、途中結果を変数に置きたい場合がある。 f (x) = max(y,z), ただし y=x2, z=10x こうした局所的変数は次の let 形式で扱える。 (let ( (変数 式) ... (変数 式) ) 本体式) 例 (defun func (x) (let ( (y (* x x)) (z (* 10 x))) (max y z) )) letは変数の値を順に計算し、前の計算結果をその後の計算に反映させる。反映させないバーションにlet*がある。

本来の関数型に反する機能 変数への代入: 手続き的プログラムの機能 - progn 破壊的リスト操作 - rplaca, rplacd シンボルに属性を付加する形で、代入が可能 - setq それ以外にシンボルに様々な属性を与えることができる(pリスト) 手続き的プログラムの機能 - progn 破壊的リスト操作 - rplaca, rplacd 入出力関数など - print, format

set, setq setは、シンボルに値を割り当てる。 (set ’x ’(1 2 3)) 第1引数のシンボルはたいていいつもquoteされるので、これを含めた形式として次を許す。 (setq x ’(1 2 3)) setqでなくsetを使うのは、たとえば次の場合。 (setq x ’a) (set x ’(1 2 3)) → xにはaが、aに(1 2 3)が代入される。

progn形式 LISPも手続き型言語と同様の形式を持つ。 (progn 式 式 ・・・ 式) 式を順に評価し、最後の式の値が全体の値になる。 最後の式以外の値は捨てられる。 これが意味があるのは、途中の式がsetqのような副作用のある形式の場合のみ。 さらに、ラベルとgoto文も持つ。 let形式の本体式は、複数置くことができる。この場合の解釈はprognと同じ=implicit prognという。

破壊的関数:rplaca, rplacd rplaca (ルプラッカ、replace car), rplacd (ルプラクディ、replace cdr)は リストを破壊的に操作する 副作用を目的としている。 (setq x ’(a b c d)) (rplaca x 1) → x=(1 b c d) (rplacd x ’(2 3)) → x=(1 2 3)

メモリ構造 LISPは関数型言語という抽象的性格の反面、メモリ使用を気にする必要がある。 データの等価性も2種類(実際は更に多数)ある。 (setq x ’(1 2 3)) (setq y (cons 100 x))   → y=(100 1 2 3) (rplaca x 99) → x=(99 2 3) y=(100 99 2 3) (setq x ’(4 5)) → x=(4 5) y=(100 99 2 3) (rplacd x y) → ? データの等価性も2種類(実際は更に多数)ある。 (eq x y) 同じメモリ領域または同じアトム (equal x y) 印字名が同じ

練習 次を順に評価したとき、その式およびx,yの値どうなるか答よ? (setq x ’(nagoya inst tech)) (setq y (cons x x)) (eq x (cadr y)) (rplacd x ’cs) (rplaca x ’nit) (eq x (car y)) (eq (cons x x) y)

練習 リストを使って多数の人物のデータを記録している。 (データ1 データ2 … ) 各データは次の形式。 (データ1  データ2 … ) 各データは次の形式。 (人物名 (属性1 データ) (属性2 データ) … ) この形式のデータリストLに対し、次の関数を書け。    (getdata L 人物名 属性) で人物のその属性を返す関数。    (putdata L 人物名 属性 値) 属性を値で書換える関数。属性がなければ追加する。     (putdataL  人物名 属性 値) putdataと同様の機能を、グローバルな変数Lの内容を書換える方法で実現せよ。

まとめ LISPは代表的関数型言語。リスト処理を中心とし、記号処理が得意。 統一規格common lispは広範囲に用いられている。 関数の定義、適用が計算の中心。 純粋な関数型に反する仕組みを多数用意する。 追加 LISPは変数宣言を意識する必要がない。そのため、メモリの回収の仕掛けが重要=ガーベージコレクション。