Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Coqでsprintf upcamp 2012 にて
Slide 2
Slide 2 text
Coqでsprintf • printf(“%s : %d¥n”, “Coq”, strlen(“Coq”)); • 第二引数以降の型が、第一引数に依存! • 依存型のわかりやすい例
Slide 3
Slide 3 text
Coqでsprintf • printf(“%s : %d¥n”, “Coq”, strlen(“Coq”)); • 第二引数以降の型が、第一引数に依存! • 依存型のわかりやすい例 • sprintf “Hello” – (string)型を返して欲しい • sprintf “There are %d pens.” – (Z -> string)型を返して欲しい • 引数によって戻り値の型が異なる
Slide 4
Slide 4 text
Coqでsprintf • Coqにおける文字・文字列 – 文字(ascii) : 8ビットのタプル – 文字列(string) : asciiからなるリスト構造 • Coqにおける整数 – 自然数(nat) : ペアノの公理による非負整数 – 整数(Z) : 2進数表現による整数
Slide 5
Slide 5 text
toStringの実装 • Zからstringへ変換 • 一般的な再帰で書く • 停止性証明が必要なので、Fixpointではなく Functionで書く • 一部を証明モードで補完したいので、 FunctionではなくProgram Fixpointを使う
Slide 6
Slide 6 text
関数定義の命令 証明モードを併用しない 証明モードを併用する 単なる定義 Definition Program Definition 構造帰納法による定義 Fixpoint{struct x} Program Fixpoint{struct x} 停止性証明による定義(1) Function{wf lt x} Program Fixpoint{wf lt x} 停止性証明による定義(2) Function{measure f x} Program Fixpoint{measure f x} 余帰納法 CoFixpoint Program CoFixpoint ※1 Functionでは、定義直後に停止性証明の証明モードに入る。証明終了後に実際 に関数が定義される。 ※2 Programでは、定義後にObligation命令(Obligation 1 や Next Obligation) を使って プレースホルダーの証明をするモードに入る。証明終了後に実際に関数が定義され る。場合によっては全て自動で証明されてしまう。 ※3 Fixpoint{struct x}では、引数xの構造について単調減少な再帰呼び出しのみ許可 される。CoFixpointでは、戻り値の構造について単調減少な再帰呼び出しのみ許可さ れる。
Slide 7
Slide 7 text
toStringの実装 • 非負整数Nから文字列への変換関数 • 再帰呼び出しでNの値が単調減少
Slide 8
Slide 8 text
toStringの実装 • 整数から文字列への変換関数
Slide 9
Slide 9 text
toStringの実装 • 実行例
Slide 10
Slide 10 text
sprintfの実装の準備 • 型と値のペアを定義する
Slide 11
Slide 11 text
sprintfの実装の準備 • {| TV_T := nat ; TV_V := 10 |} • {| TV_T := string ; TV_V := “Hello” |}
Slide 12
Slide 12 text
sprintfの実装 • sprintf_impl – 書式文字列に対する再帰で書く – 構造帰納法なので停止性証明は不要 • “%04d”などの複雑な書式文字列に対応したい場合、 停止性証明を導入する必要性が生じそう
Slide 13
Slide 13 text
sprintfの実装 • 帰納法&マッチング
Slide 14
Slide 14 text
sprintfの実装 • 実行例 • sprintf “Hello, world!” – → “Hello, world!” • sprintf “%d + %d = %d” (1) (2) (1+2) – → “1 + 2 = 3” • sprintf “Hello, %s!” “Masaki” – → “Hello, Masaki”
Slide 15
Slide 15 text
ソースコード • https://gist.github.com/3329025
Slide 16
Slide 16 text
おまけ emacsで:wしたら強制終了するマクロを作るっていうネタあるんですけど使う人 居ますか [2012/08/11 22:28:45] qnighy (原 将己): vimでC-x C-sしたら強制終了っていう逆 のネタもあります
Slide 17
Slide 17 text
おまけ • 「VimでEmacsの保存コマンド→死亡」 を実装してみました
Slide 18
Slide 18 text
おまけ • といっても以下の2つを実行するだけ • :map :qall! • :map! :qall! • SLでは物足らないあなたに…