プログラミング言語論プログラミング言語論 プログラムの意味論 水野嘉明

Slides:



Advertisements
Similar presentations
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Advertisements

人工知能特論2011 No.4 東京工科大学大学院 担当教員:亀田弘之.
人工知能特論2007 No.4 東京工科大学大学院 担当教員:亀田弘之.
第6回条件による分岐.
プログラミング基礎I(再) 山元進.
コンパイラ 2011年10月17日
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
基礎プログラミングおよび演習 第4回 担当:花岡 5階522/520.
プログラム理論特論 第2回 亀山幸義
プログラミング基礎I(再) 山元進.
授業展開#11 コンピュータは 何ができるか、できないか.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
プログラミング言語論 第4回 式の構文、式の評価
論理式の表現を数学的に取り扱いやすくするために代数学の助けを借りる.
人工知能特論2011 資料No.6 東京工科大学大学院 担当教員 亀田弘之.
香川大学工学部 富永浩之 情報数学1 第5-2章 命題論理式の 同値変形とカルノー表 香川大学工学部 富永浩之
Natural Semantics 実行過程の、最初と最後の状態(state)の関係を考える。
Semantics with Applications
プログラミング言語論 プログラミング言語論 プログラミング言語論 演習1 解答と解説 演習1解答と解説 1 1.
条件式 (Conditional Expressions)
情報教育論 第9回 仮定文の仕組み 政策・メディア研究科 岡田 健.
数理論理学 第1回 茨城大学工学部情報工学科 佐々木 稔.
言語処理系(8) 金子敬一.
コンパイラ 2012年10月15日
エージェントアプローチ 人工知能 7章・8章 B4 片渕 08/07/18.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
第7回 条件による繰り返し.
寄せられた質問: 演習問題について この講義の範囲に含まれる適切な演習問題が載っている参考書がありますか? できれば解答や解説が付いているものがあると良いのですが… 第3回の授業の中で、演習問題に取り組む方法を説明します.
プログラムの制御構造 選択・繰り返し.
述語論理と∀(全称)∃(存在) 3回の講義の概観: 命題論理 (真理値) (公理と推論規則) 述語論理 (モデルと解釈)
述語論理と∀(全称)∃(存在) 3回の講義の概観: 命題論理 (真理値) (公理と推論規則) 述語論理 (モデルと解釈)
繰り返し計算 while文, for文.
第10回関数 Ⅱ (ローカル変数とスコープ).
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
7.4 Two General Settings D3 杉原堅也.
第7回 条件による繰り返し.
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
国立情報学研究所 ソフトウェア研究系 助教授/
 型推論1(単相型) 2007.
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
計算機構成 第3回 データパス:計算をするところ テキスト14‐19、29‐35
計算機科学概論(応用編) 数理論理学を用いた自動証明
プログラミング言語論 第7回 文の翻訳 C言語の文 表明 Hoare論理
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
コンパイラ 2011年10月20日
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミングⅡ 第2回.
国立情報学研究所 ソフトウェア研究系 助教授/
第7回  命題論理.
プログラミング言語論 第10回 情報工学科 篠埜 功.
復習 if ~ 選択制御文(条件分岐) カッコが必要 true 条件 false 真(true)なら この中が aを2倍する 実行される
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
情報処理Ⅱ 2005年10月28日(金).
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
香川大学工学部 富永浩之 情報数学1 第5-2章 命題論理式の 同値変形とカルノー表 香川大学工学部 富永浩之
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
情報数理Ⅱ 第10章 オートマトン 平成28年12月21日.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング1 プログラミング演習I 第2回.
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
数理論理学 最終回 茨城大学工学部情報工学科 佐々木 稔.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
アルゴリズム ~すべてのプログラムの基礎~.
Presentation transcript:

プログラミング言語論プログラミング言語論 プログラムの意味論 水野嘉明 1 1 1

目次 1. 意味論とは 2. 操作的意味論 3. 表示的意味論 4. 公理的意味論 5. 各意味論の関係 2

プログラミング言語論プログラミング言語論 1. 意味論とは プログラムの意味論とは プログラムに意味を与える方法 3 プログラムの意味論 3 3 3

1. 意味論とは プログラムの意味の定義 自然言語による記述 ハードウェアの動作としての理解 既知のプログラミング言語による 類似の文・式の意味の記述 厳密に定義することは困難 4

1. 意味論とは 例 CやJavaの 後置++演算子は、「式を評価した後、その変数の値を1増やす」 と説明されることが多い 「x=1; x = x++」で何が起きるかは、分かりにくい 5

1. 意味論とは 厳密で矛盾なく意味を定義するには 計算機とは独立して定義できる 定義が厳密で、曖昧さがない プログラムの推論・解析に役立つ 等が必要 形式的意味論 (formal semantics) 6

1. 意味論とは 形式的意味論の目的 プログラムの意味を厳密に定義 プログラムの正しさを形式的に検証 検証を支援するツールの作成 自動証明法の研究 プログラミング言語の設計の検証 7

1. 意味論とは 形式的意味論の種類 操作的意味論 (Operational Semantics) 表示的意味論 (Denotational Semantics) 公理的意味論 (Axiomatics Semantics) 色々な意味論が提唱されているが、おおむねこの3つのどれかに分類されるか、あるいはこれらの組み合わせである 8

1. 意味論とは 形式的意味論の概要 操作的意味論 プログラムの意味を、抽象的な計算機の動作(状態遷移)として記述する 9

1. 意味論とは 表示的意味論 プログラムの意味を、ある数学的な関数として定式化する 公理的意味論 プログラムに関する公理と推論規則を与え、定理としての意味を導く 10

2. 操作的意味論 2.1 定義 2.2 意味関数 2.3 文の意味 11

プログラミング言語論プログラミング言語論 2. 操作的意味論 C言語の非常に小さいサブセットの形式的意味記述を考える main関数のみ 型は整数型 int のみ 代入文、および基本的な制御文 簡単な入出力文 本講義では、入出力文は省略 12 プログラムの意味論

2.1 定義 プログラム例 void main() { int x, y, s, d; scanf("%d", &x); s = x + y; d = x - y; printf(%d %d\n", s, d); } 13

2.1 定義 状態の定義 変数名の集合を Var とする 値の集合を Value とする 前ページのプログラム例ならば、 Var = {x, y, s, d, input, output} Value = (Z∪{\n})* ∪ {true, false} 14

プログラミング言語論プログラミング言語論 2.1 定義 定義域をVar、値域をValueとする関数 σ: Var → Value を状態 と呼ぶ 状態の集合を Sとする S = {σ|σ: Var → Value} 状態:「環境」と呼ぶこともある 15 プログラムの意味論

2.1 定義 注: 状態σとは 各変数にどのような値が対応しているか、が状態である σ(x) とは、状態σにおける変数xの値である 変数と値の対応が変わる(つまり変数の値が変わる)と、別の状態となる 16

2.1 定義 σ[a/x] 状態σから変数 xの値が aに変化した、新しい状態を と書く 17

2.1 定義 となる σ∈S、a∈Value、x∈Varのとき σ[a/x]∈S であり、 (σ[a/x])(x) = a (σ[a/x])(y) = σ(y) (ただし、y≠x) となる 18

2.1 定義 例 状態σ、σ’∈S について、ある変数 x(∈Var)以外のすべての変数yに対して σ(y) = σ’(y) の時、 σ’= σ[σ’(x)/x] である 19

2.2 意味関数 プログラムの文の意味を 状態σ∈Sを別の状態σ'∈Sに かえる関数 とする 文に対し、その文の意味を返す関数を 意味関数 と呼び、Mで表わす M[[文]]: S→S 20

2.2 意味関数 注: Mは関数であるので、 M(文) と書くべきであるが、プログラム の文を引数とするときは M[[文]] と書くことが多い 21

プログラミング言語論プログラミング言語論 2.2 意味関数 代入文 x = a; の意味 M[[ x=a; ]] =λσ.σ[a/x] ※文「 x=a; 」 の意味は、 状態σの変数xの値を 定数の値aで置き換えて新しい状態とすること ※λ記法を使わずに書くと M[[ x=a; ]](σ) = σ[a/x] a は、定数とする 22 プログラムの意味論

2.2 意味関数 文の並び 文1文2…文n の意味 (n>1) M[[文1文2…文n]] = λσ. M[[文n]] (M[[文1…文n-1]](σ)) 状態σが文1によりσ1になり、文2によりσ2になり、・・・、文nにより状態σnとなる 23

2.2 意味関数 式の意味 f : S → Value 状態に応じて値を対応させる関数 式の意味を与える関数 E[[式]]: S → Value 状態に応じて値を対応させる関数 式には値が対応するが、状態によってその値は異なる 24

2.2 意味関数 x∈Var、c∈Z∪{true,false}、e1とe2を式とするとき、 E[[x]](σ) = σ(x) E[[c]](σ) = c E[[(e1)]] = E[[e1]] E[[e1 op e2]](σ) = E[[e1]] (σ) op E[[e2]] (σ) 25

2.2 意味関数 前記の定義は、 変数のみの式の意味は、その状態での変数の値 定数のみの式の意味は、その定数の値 括弧でくくった式の意味は、括弧の中の式の意味 26

2.2 意味関数 (式1 op 式2) の意味は、 (式1の意味) op (式2の意味) 例: E[[e1 * e2]] = E[[e1]]×E[[e2]] 27

プログラミング言語論プログラミング言語論 2.3 文の意味 代入文 x = e ; の意味 M[[ x=e ; ]] = λσ.σ[ E[[e]](σ)/x ] 状態σにおける式e の値 e は式である。 この値で x を置き換えて新しい状態とする 28 プログラムの意味論

2.3 文の意味 例: 文「 s=x+y; 」 の意味 M[[ s=x+y; ]] =λσ.σ[σ(x)+σ(y)/s] 状態σの変数sの値を その状態での変数xの値σ(x)と変数yの値σ(y)の和で置き換えて新しい状態とすること 29

2.3 文の意味 if 文の意味 M[[ if (e) s1 else s2 ]] = λσ. if-then-else( E[[e]](σ), M[[s1]](σ), M[[s2]](σ) ) もし E[[e]](σ)が真ならば、M[[s1]]、さもなければ M[[s2]]が、この if文の意味 30

2.3 文の意味 注: if-then-elseの評価は、 第1引数をまず評価し、 それが真であれば第2引数を 偽であれば第3引数を評価する 31

2.3 文の意味 if 文の意味 (2) M[[ if (e) s1 ]] = λσ. if-then-else( E[[e]](σ), M[[s1]](σ), σ ) else節がないので、E[[e]](σ)が偽ならば状態σは変わらない 32

プログラミング言語論プログラミング言語論 2.3 文の意味 while文 「while(e) s1」 の意味 M[[ while(e) s1 ]] = λσ. if-then-else( E[[e]](σ), M[[while(e) s1]]( M[[s1]](σ) ), σ ) if-then-else の第2引数の評価では、引数部の M[[s1]](σ) の評価を最初に行う 33 プログラムの意味論

2.3 文の意味 f = M[[ while(e) s1 ]] とおいて 前ページの式を書き換えると f (M[[s1]](σ)), σ ) f (σ) = if-then-else( E[[e]](σ), f (M[[s1]](σ)), σ ) 式eが環境σで真ならば、s1を実行し新たな環境で再度 f を評価する。 さもなければ、σは変化しない。 34

3. 表示的意味論 3.1 表示的意味論とは 3.2 表示的意味論における意味 35

3.1 表示的意味論とは 表示的意味論とは プログラムの集合をPとする 数学的な値の集合(意味領域)Dと 意味関数 M:P→D の対 (D,M)で意味を与える方法 36

3.1 表示的意味論とは p∈Pの意味を M[[p]]∈Dで与えることから、p はM[[p]]を指し示す(denote)といい、 M[[p]] を p の表示 (denotation) 、あるいは表示的意味(denotational meaning)という ⇒ ここから、表示的意味論という 37

3.1 表示的意味論とは プログラムの要素 意味領域の要素 M 変数 ? 式 ? ? 文 A B … [[A]] [[B]] … A+2   B … [[A]]   [[B]] … 式 ?  A+2 2B+C   [[A+2]] [[ 2B+C]] ? 文  A:=A+2 if A>0 then …  [[A:=A+2]] [[ if A>0 then … ]] 38

3.2 表示的意味論における意味 プログラムの実行に伴う状態の変化を記述する点は操作的意味論と同じだが、それを数学的手法 でやるところが違う 39

3.2 表示的意味論における意味 操作的意味論では、次の関数を定義した 文の意味を与える関数 M[[文]]: S→S 式の意味を与える関数 E[[式]]: S → Value 40

3.2 表示的意味論における意味 次のような式や文の意味は、操作的意味論と同様 E[[x]](σ) = σ(x) E[[c]](σ) = c E[[e1 op e2]](σ) = E[[e1]] (σ) op E[[e2]] (σ) M[[ x=e ; ]] =λσ.σ[ E[[e]](σ)/x ] 41

3.2 表示的意味論における意味 while 文の意味 操作的意味論では、 if-then-elseを用いて、操作的に定義 表示的意味論では、数学的に厳密な意味として、次の関数 F の最小不動点を while文の意味とする 42

3.2 表示的意味論における意味 while文 「while(e) s1」の意味 ≡ 次の関数Fの最小不動点 F =λf.λσ. if-then-else(E[[e]](σ), f (M[[s1]](σ)), σ) (不動点とは F(f)=f を満たす関数f のこと) 43

3.2 表示的意味論における意味 プログラムの意味をきわめて厳密に取り扱うことができる 難解な数式になってしまうところが欠点 44

4. 公理的意味論 4.1 準備 4.2 表明 4.3 公理と推論規則 4.4 プログラムの正当性 45

4. 公理的意味論 ホーア(Hoare)の公理系と呼ばれる 公理と推論規則(Hoareの論理)を与える 得られる結果(定理)をプログラムの意味とする 46

4.1 準備 言葉の意味 公理 (axiom) その他の命題を導きだすための前提として導入される最も基本的な仮定のこと 定理 (theorem) 公理を前提として推論規則によって導きだされた命題 47

4.1 準備 表明 (assertion) プログラムの中の特定の場所で変数の値の間に成立する条件式 48

4.1 準備 推論規則の書式 S1 S2 S3 ・・・ S とは、横線の上の式がすべて成立するならば、横線の下側の式が成立することを示している 49

プログラミング言語論プログラミング言語論 4.1 準備 例1 a=b b=c a=c 例2 A A⇒B B ⇒ は含意(ならば)を表す 50 プログラムの意味論 50 50

4.1 準備 Aを論理式、xを変数、eを式とする Aの中に出現するすべてのxを、eで置き換えた式を で表わす A[e/x] 51

4.1 準備 例1 (y=x)[a/x] = (y=a) 例2 ((x+y) < (x-z))[x-y/x] = ((x-y)+y) < ((x-y)-z) 52

4.2 表明 Hoareの論理で扱う 表明 (assertion) {A}P{B} プログラムPの実行前にAが成立 AとBは論理式、Pはプログラムまたはプログラムの文 プログラムPの実行前にAが成立 Pを実行前し停止した後はBが成立 53

プログラミング言語論プログラミング言語論 4.2 表明 A を事前条件 (precondition)、 B を事後条件 (postcondition) という {A}P{B}は、次の論理式と等価 ∀σ,σ’∈S, (E[[A]](σ)∧M[[P]](σ)=σ’) ⇒ E[[B]](σ’) 54 プログラムの意味論 54 54

4.3 公理と推論規則 公理 (代入の規則) ここで、xは変数、eは式、Aは論理式である {A[e/x]}x=e;{A} 55

4.3 公理と推論規則 推論規則(1) -- 文の並びの規則 {A}文1{B} {B}文2・・・文n{C} {A}文1文2・・・文n{C} 56

プログラミング言語論プログラミング言語論 4.3 公理と推論規則 推論規則(2) -- 条件文の規則 {A∧B}文1{C} {A∧¬B}文2{C} {A} if (B)文1else文2{C} {A∧B}文1{C} A∧¬B⇒C {A} if (B)文1{C} ⇒ は含意(ならば)を表す論理記号 57 プログラムの意味論 57 57

4.3 公理と推論規則 条件文に対する流れ図 A A B 文1 文2 B 文1 false false true true C C 58

プログラミング言語論プログラミング言語論 4.3 公理と推論規則 推論規則(3) -- 帰結の規則 A⇒A' {A'}文{B} {A}文{B} {A}文{B'} B'⇒B ⇒ は含意(ならば)を表す論理記号 59 プログラムの意味論 59

プログラミング言語論プログラミング言語論 4.3 公理と推論規則 推論規則(4) -- while文の規則 {A∧B}文{A} {A} while(B)文 {A∧¬B} 60 プログラムの意味論 60 60

4.3 公理と推論規則 while文に対する流れ図 A B 文 false true Aを ループ不変表明 という A 61

プログラミング言語論プログラミング言語論 4.4 プログラムの正当性 プログラムPに要求される条件を事後条件Bとする 表明 {A}P{B}が定理として得られる (Pの実行前にAが成立するとき、Pを 実行し停止した後はBが成り立つ) Pの正当性を保障する条件=A 定理:公理を前提として推論規則により導き出された命題 62 プログラムの意味論

4.4 プログラムの正当性 例題:次の文 P を考える P = { i = 1; x = 1; while(i ≦ n) { x = x * i; i = i + 1; } } プログラム Pの意図は、x=n! {A}P{x=n!} が定理となるAを求めてみる 63

4.4 プログラムの正当性 while文の推論規則を適用するには、 {A1∧(i≦n)}{x=x*i; i=i+1;}{A1} となる ループ不変表明 (loop invariant assertion) A1が必要 i ≦ n + 1 ∧ x = (i - 1) ! 64

4.4 プログラムの正当性 ループ不変表明A1は、whileの条件 (i ≦ n) 判定時に、常に成立 x = x*i; i = i+1; t f i ≦ n + 1 ∧ x = (i - 1) ! 65

4.4 プログラムの正当性 このループ不変表明A1を用いると、事前条件を {n≧0}とした が定理として導き出せる これにより、n≧0ならばPが正しいことが証明できた {n ≧ 0} P {x = n!} 66

4.4 プログラムの正当性 この定理の導出(証明)は、別紙 「例題の証明」 に記載しておく (例題終了) 67

4.4 プログラムの正当性 Hoareの論理を用いて プログラムの正当性を示すには、 適切なループ不変表明を見つけることが必要 見つけることは 難しい 必ず存在する 68

5. 各意味論の関係 意味記述の抽象度 操作的意味論 低 表示的意味論 公理的意味論 高 69

5. 各意味論の関係 各意味論の間には、密接な関係 どれも、プログラミング言語で書かれたプログラムの意味を正確に理解するための道具 70

お疲れ様でした