• 検索結果がありません。

Software Foundations その

N/A
N/A
Protected

Academic year: 2021

シェア "Software Foundations その"

Copied!
24
0
0

読み込み中.... (全文を見る)

全文

(1)

「計算と論理」

Software Foundations その 2

五十嵐 淳

[email protected] [email protected]

京都大学

October 14, 2014

(2)

別ファイルの定義・定理の読み込み

Require Export Basics.

Basics.v

を「コンパイル」した

Basics.vo

が必要.

参考情報

: Induction.v

冒頭

テキストのディレクトリで

make

してもよい

(

はず

)

(3)

Induction.v

場合分けに名前をつける

(Case

タクティック

)

数学的帰納法による証明

(induction

タクティック

)

証明中の証明

(assert

タクティック

)

(4)

場合分けに名前をつける

場合分けの証明は読みにくい

どこまでが「ひとつの場合」なの

!?

コメント・インデントをつける?

今どの場合を証明しようとしているか

(

特にコメ ントが画面の外に流れると

)

わかりにくい

Case

タクティック

!

この教科書の著者謹製

教科書をこの部分まで読み込むと使えるように

なる

(5)

Case を使って書き直した証明

Theorem andb_true_elim1 : forall b c : bool, andb b c = true -> b = true.

Proof.

intros b c H.

destruct b.

Case "b = true".

reflexivity.

Case "b = false".

rewrite <- H.

reflexivity.

Qed.

デモ

:

単なるコメントとの違い

(6)

Case タクティック

Case

の使用は強制ではないが強く推奨

後で読み返してわかる証明を書こう

!

(Case

に限らず,一行の長さとかも気をつけよう

!)

場合分けが入れ子になる時のための

SCase, SSCase, . . .

SCase = subcase

(7)

Induction.v

場合分けに名前をつける

(Case

タクティック

)

数学的帰納法による証明

(induction

タクティック

)

証明中の証明

(assert

タクティック

)

(8)

帰納法による証明

定理 : 0 は足し算の右単位元

Theorem plus_0_r : forall n:nat, n + 0 = n.

詰まる証明

Proof.

intros n. reflexivity. (*

エラー

! *)

何が起こっているのか?

Proof.

intros n. simpl. (*

左辺は計算できない

*)

(9)

「こういう時は場合分けでしょ?」

またもや詰まる証明

Proof.

intros n. destruct n as [| n’].

Case "n = 0".

reflexivity. (* so far so good... *) Case "n = S n’".

場合分けをいくら続けてもキリがない

!

n

より

1

小さい

n’

について

plus_0_r

が成り立って

いれば…

(10)

「こういう時は場合分けでしょ?」

またもや詰まる証明

Proof.

intros n. destruct n as [| n’].

Case "n = 0".

reflexivity. (* so far so good... *) Case "n = S n’".

simpl. (*

また同じようなゴールが…

orz *)

場合分けをいくら続けてもキリがない

!

n

より

1

小さい

n’

について

plus_0_r

が成り立って

いれば…

(11)

「こういう時は場合分けでしょ?」

またもや詰まる証明

Proof.

intros n. destruct n as [| n’].

Case "n = 0".

reflexivity. (* so far so good... *) Case "n = S n’".

simpl. (*

また同じようなゴールが…

orz *)

場合分けをいくら続けてもキリがない

!

n

より

1

小さい

n’

について

plus_0_r

が成り立って

いれば…

数学的帰納法

(12)

数学的帰納法

P(n)

を自然数

n

の性質について述べた命題とする

数学的帰納法の原理

「任意の自然数

n

について

P(n)

」は以下と同値

P(0)

かつ

任意の自然数

n

について,

P(n)

ならば

P(S n)

単なる場合分けと違って,

P(S n)

を示すのに,ひと つ小さい数では

P

が成立していること

(

つまり

P(n))

を仮定してよい

P(n)

を「帰納法の仮定」

(induction hypothesis, IH)

と呼ぶ

(13)

数学的帰納法の妥当性

個々の具体的な数

(

例えば

4)

について

P

が成立するこ とが,

P(0)

かつ

任意の自然数

n

について,

P(n)

ならば

P(S n)

を組み合わせて導き出せる

(14)

数学的帰納法を使った証明

Theorem plus_0_r : forall n:nat, n + 0 = n.

Proof.

intros n. induction n as [| n’].

Case "n = 0". reflexivity.

Case "n = S n’".

simpl. rewrite -> IHn’. reflexivity. Qed.

基本的な使い方は

destruct

と同じ

intro

パターン

IHn’

が帰納法の仮定

(Coq

が勝手に名前をつける

)

(15)

日本語で書くなら…

定理 : 任意の自然数 n について n + 0 = n

n

についての数学的帰納法による.

n = 0

の場合,示すべきは

0 + 0 = 0

だが,これは

+

の定義により自明.

n = S(n)

の場合,示すべきは

S(n) + 0 = S(n)

であるが,

左辺

= S(n + 0) +

の定義による

= S(n)

帰納法の仮定による

=

右辺

(16)

数学的帰納法を使った証明 (2)

Theorem minus_diag : forall n, minus n n = 0.

(17)

今日のメニュー

Induction.v

場合分けに名前をつける

(Case

タクティック

)

数学的帰納法による証明

(induction

タクティック

)

証明中の証明

(assert

タクティック

)

(18)

証明中の証明

以前に証明した定理は他の定理の証明中で使える 証明中でも「サブ定理」

(

補題

)

を宣言・証明できる

assert

タクティック

(19)

assert を使った ( 人工的な )

Theorem mult_0_plus’ : forall n m : nat, (0 + n) * m = n * m.

Proof.

intros n m.

assert (H: 0 + n = n).

Case "Proof of assertion". reflexivity.

rewrite -> H.

reflexivity. Qed.

Case

は,読み易さのため

assert (0 + n = n) as H

と書いてもよい

(20)

assert を使った ( 人工的な )

Theorem mult_0_plus’ : forall n m : nat, (0 + n) * m = n * m.

Proof.

intros n m.

assert (H: 0 + n = n).

Case "Proof of assertion". reflexivity.

rewrite -> H.

reflexivity. Qed.

Case

は,読み易さのため

assert (0 + n = n) as H

と書いてもよい

(21)

assert の挙動

新たなサブゴールとして

assert

された命題が追加 される

前のゴールの文脈には

assert

された命題が仮定と

して追加されている

(22)

assert の応用

そこじゃない !

Theorem plus_rearrange_firsttry : forall n m p q : nat,

(n + m) + (p + q) = (m + n) + (p + q).

Proof.

intros n m p q.

(* n

m

を入れ替えればいいんでしょ?

*) rewrite -> plus_comm.

(*

ゴールが…思ってたのと違う!

*)

(23)

assert の応用

Theorem plus_rearrange : forall n m p q : nat, (n + m) + (p + q) = (m + n) + (p + q).

Proof.

intros n m p q.

assert (H: n + m = m + n).

(*

この文脈での

n

m

の交換に特化

*) Case "Proof of assertion".

rewrite -> plus_comm. reflexivity.

rewrite -> H. reflexivity. Qed.

こうしなきゃいけないのはどうかと思うが…

一応,他の手段はありますが講義ではカバーしま

せん

(24)

宿題: 10/28 午前 10:30 締切

Induction.v

basic_induction (2), double_plus (2), beq_nat_refl (2)

その他は随意課題

講義・演習に関する質問,わかりにくいと感じたこ と,その他気になること,を自由に.

(

「特になし」

はダメです.

)

解答を書き込んだ

Basics.v, Induction.v

を含む

zip

ファイルをオンライン提出システムを通じて提出

友達に教えてもらったら、その人の名前を明記

参照

関連したドキュメント

証明で使われる重要な結果は mod p ガロア表現の strictly compatible system への minimal lifting theorem (以下, LT と略記する) と modular lifting theorem (主に

解析の教科書にある Lagrange の未定乗数法の証明では,

Wiese, Dihedral Galois representations and Katz modular forms, Doc. Wiles, Modular elliptic curves and Fermat’s

[CHT] Clozel, L., Harris, M., and Taylor, R., Automorphy for some ℓ-adic lifts of automorphic mod ℓ Galois representations, Publ.. A., and Levinson, N., Theory of ordinary

12―1 法第 12 条において準用する定率法第 20 条の 3 及び令第 37 条において 準用する定率法施行令第 61 条の 2 の規定の適用については、定率法基本通達 20 の 3―1、20 の 3―2

RCEP 原産国は原産地証明上の必要的記載事項となっています( ※ ) 。第三者証明 制度(原産地証明書)

れをもって関税法第 70 条に規定する他の法令の証明とされたい。. 3

※証明書のご利用は、証明書取得時に Windows ログオンを行っていた Windows アカウントでのみ 可能となります。それ以外の