プログラム理論特論 第2回 亀山幸義 [email protected] http://logic.is.tsukuba.ac.jp/~kam/progtheory この授業の目的 プログラム言語の難しい理屈を知ること? No プログラムの「正しさ」を保証する技術の基礎 を理解すること 自動的な方法 型に基づく方法 モデル検査に基づく方法 対話的な方法(人間の手助けが必要) 記号論理による演繹的方法 「現実」のプログラム言語 C: Java: オーソドックスな言語 「細かい操作が何でもできる」が、かえって危ない(ポインタ操作など) オブジェクト指向 細かい操作(危ない)操作はあまりできない 機械語レベルでの安全性検証つき ML: 関数型 高度な「型」定義機構あり 関数型とはいえ通常の言語と同様な代入文等も書ける プログラム言語の抽象化(理想化) この授業での考察対象は、現実のプログラム言語 ではなく、抽象化したプログラム言語 利点 欠点 個別のプログラム言語の些細な違いにこだわることなく、 本質的な点のみに集中することができる 抽象化したプログラム言語での理屈(理論)を現実のプロ グラム言語にそのまま適用することはできない この授業では、「型付きλ計算」を採用 計算モデル:計算とはなにか? 計算機による操作である Turing Machine Random Access Machine、多くのプログラム言語 関数である ラムダ計算、Lisp/Scheme 帰納的関数 推論(論理的思考)である 通信・コミュニケーションである 定理証明手続き、Prolog 並列計算モデル DNA計算・自然計算、量子計算 ラムダ計算 (Lambda Calculus) 型のないラムダ計算と型付ラムダ計算がある まず、型のないラムダ計算をとりあげる Church, Curry 等がはじめた 「関数」の概念を定式化したもの 関数呼び出しを表現する それ以外の概念は一切捨てる 変数への値の代入、制御構造、等 λ計算 ーInformal Introductionー 関数とは? 性質 いくつかの入力(引数)をもらって、出力(返り 値)を1つ返すもの:プログラムと共通する点 同じ入力を与えれば、いつでも同じ出力が 返ってくる:プログラムとは必ずしも一致しない 点 関数とは? 次の関数を微分すると何になるか? ∫f(x)dx と ∫f(y)dy は「関数として」同じ x3+5x+2 x3+ax+b x3+yx+2 どの変数に着目するかによって結果が異なる a, b が x、y に依存する変数だったら? 本当にそうか? 「関数」と呼ぶ以上、出力結果だけでなく、どの変 数が入力かを明示しなければおかしい。 λ記法 入力となる変数を 「λ変数.」 と記述する。 λx.x3+5x+2 「微分する」という操作をD であらわすと λx.x+1 と λy.y+1 という関数は同じ 一方、λx. x-y と λy. x-y は違う 「積分する」という操作を Int であらわすと D(λx.x3+5x+2) = λx. 3x2+5 Int (λx.f(x)) と Int(λy.f(y)) は同じ λ記法を使うと、高階関数が簡単に書ける 引数や返り値として関数をとる関数 例: 上のDやInt λ記法(つづき) 関数に引数を食わせる 関数「λx.x3+5x+2」に、引数「3」を適用すると 答えとして44が返ってくる 3 (λx.x +5x+2)(3) を計算すると 44 になる。 (λx.x3+5x+2)(3) ⇒ 44 3 D(λx.x +5x+2) ⇒ λx. 3x2+5 ((λx.(λy.x3+5x+y))(3))(5) ⇒ 47 (λf.(λx. (f(x)+1))) (λy.y*2) ⇒ λx.(λy.y*2)(x)+1 ⇒ λx. x*2+1 ((λf.(λx. (f(x)+1))) (λy.y*2)) (4)⇒ 9 形式的な記述 非形式的記述 構文や意味を厳密に定めない われわれが通常とっている方法 厳密な議論には適さない(とくに、「○○を示すことができ ない」ことを示すためには、議論の対象となっている仮定 や推論方法を厳密に決める必要がある) 形式化、形式的記述 誰が見てもただしさが納得できるように、使っている規則 や仮定を明示する 客観的に正しいかどうか判断できる 機械(コンピュータ)でも! λ計算 ーFormal Introductionー 構文 変数 変数 x, y, … がある(無限個の変数がある) 文脈 変数の有限集合を文脈と呼び、Γ、Δ等であら わす 例: Γ={x, y} 判断 Γ|- M:Λ と言う形の表現 Γという文脈のもとで、項Mはλ式である 項Mはλ式であり、その自由変数はΓである。 構文 項の構成規則 Γ|- M: Λ Γ|-x : Λ (x∈Γ) Δ|- λx.M: Λ Δ=Γ-{x} Γ|- M: Λ Γ|- N: Λ Γ|- MN: Λ 例題 Δ|- f : Λ Δ|- x : Λ Δ|- f : Λ Δ|- f x : Λ Δ|- f (f x) : Λ Γ|- λx. f (f x) : Λ {}|- λf. λx. f (f x) : Λ Γ={f} Δ={f, x} 自由変数 同じMに対して、何通りものΓに対して、 Γ|M:Λ が証明できることがある そのような最小のΓを、「Mの自由変数の集 合」という。 例: λx. x+y の自由変数は y だけ 例: (λx.x+y) + x の自由変数は x と y 自由でない変数(束縛変数)は、一斉に名前 をかえても「同じ」λ式である 例: λf. f(λy.fy) と λg. g(λx.gx) は同じ 意味論 構文を決める=日本語の場合、どういう文字 列が「日本語の文」であるかを決める 意味を決める=それぞれの文がどう振舞うか を決める 意味論 操作的意味論 ←今回の講義で扱う 公理的意味論 Hoare論理 表示的意味論 Scott理論 操作的意味 計算規則を決めること 計算規則 (λx. M) N ⇒ M [N/x] M⇒Nならば、C[M]⇒C[N] 操作的意味 代入 x[M/x] ≡ M y[M/x] ≡ y (λy.L)[M/x] ≡ λy. L[M/x] ではない! (λy.L)[M/x]≡λz. (L[z/y][M/x]) ただし、z は x とは異なる変数で、かつ、 Mの自由変数でないもの 計算:例題 (λf. λx. f (f x))(λy. y+5) ⇒λx.(λy.y+5)((λy.y+5)x) ⇒λx.(λy.y+5)(x+5) ⇒λx.(x+5)+5 (λf. λx. f (f x))(λy. y+x) ⇒λx.(λy.y+x)((λy.y+x)x) ⇒λx. (x+x)+x ??? (λf. λx. f (f x))(λy. y+x) ⇒λz.(λy.y+x)((λy.y+x)z) ⇒λx. (x+z)+z λ計算 特徴 Lisp, ML における関数呼び出しをsimulateす ることができる (define (foo x) (+ x 1) foo≡λx. x+1 (foo (foo 3)) ⇒ 5 foo (foo 3)) ⇒5 (define (double f x) (f (f x))) double≡λf.λx.f(fx) (double foo 3) ⇒ 5 (double foo) 3 ⇒5 非決定的な計算である 形式と意味 形式と意味 形式的 vs 意味的/内容的/実質的 前者: 形だけ、目に見えるが内容を伴わない 後者: 本質、目に見えない(ことが多い)が大事なもの 本当にそうか? 数学における「形式主義」(Hilbertのプログラム) 自然科学=何らかの対象のモデル化、定式化から始ま る学問 体系化された知識は何らかの形式をもって蓄えられるは ず 計算機は形式的なデータを対象にしているが、意味は 扱えないのか? 形式的体系 (Formal System) 記号列の集合として定義 種々の概念を厳密に(客観的に、計算機により操 作可能な形で)定義する 帰納的定義 無限個の「もの」を有限的手段で定義 例: 自然数、リスト、二分木 帰納法 (例:自然数に対する数学的帰納法) 意味論 (Semantics) 形式的体系Fの(形式的)意味論とは、 数学的対象とは? F から(別の)数学的対象への対応付け(写像) ただし、F の構造を保つもの 特に定義はないが、「既に性質がよくわかっている数学的 対象」を選ぶことがおおい 例:プログラムの意味を、集合や関数で記述する 意味論は何の役に立つのか? 2つの(文面は異なる)計算機プログラムが同じであること を示す F の(表面に現れない)構造が見えてくる 記号論理における形式と意味 記号論理の形式的体系 「論理式」「証明」などの概念を、記号列の集合として帰納 的に定義したもの、あるいは 論理式や証明を導きだすゲームのルールを決めたもの 「A⊃A」という論理式がゲームのルールに従って導きだせるかど うか?(証明可能かどうか?)という議論。 正しいとか誤っている、という議論ではない。 証明論:形式的証明の構造に関する理論 意味論 単なる記号列としての論理式等に、他の数学的対象を対 応つけたもの (e.g. 集合論、Turing機械) 参考書 以下の本の第1章 佐藤雅彦,桜井貴文「プログラムの基礎理 論」,岩波講座ソフトウェア科学13,岩波 書店
© Copyright 2024 ExpyDoc