coqでsprintf

17

Click here to load reader

Upload: masaki-hara

Post on 09-Jul-2015

312 views

Category:

Technology


2 download

DESCRIPTION

upcamp 2012 にて

TRANSCRIPT

Page 1: Coqでsprintf

Coqでsprintf

upcamp 2012 にて

Page 2: Coqでsprintf

Coqでsprintf

• printf(“%s : %d\n”, “Coq”, strlen(“Coq”));

• 第二引数以降の型が、第一引数に依存!

• 依存型のわかりやすい例

Page 3: Coqでsprintf

Coqでsprintf

• printf(“%s : %d\n”, “Coq”, strlen(“Coq”));

• 第二引数以降の型が、第一引数に依存!

• 依存型のわかりやすい例

• sprintf “Hello”– (string)型を返して欲しい

• sprintf “There are %d pens.”– (Z -> string)型を返して欲しい

• 引数によって戻り値の型が異なる

Page 4: Coqでsprintf

Coqでsprintf

• Coqにおける文字・文字列

– 文字(ascii) : 8ビットのタプル

– 文字列(string) : asciiからなるリスト構造

• Coqにおける整数

– 自然数(nat) : ペアノの公理による非負整数

– 整数(Z) : 2進数表現による整数

Page 5: Coqでsprintf

toStringの実装

• Zからstringへ変換

• 一般的な再帰で書く

• 停止性証明が必要なので、FixpointではなくFunctionで書く

• 一部を証明モードで補完したいので、FunctionではなくProgram Fixpointを使う

Page 6: Coqでsprintf

関数定義の命令

証明モードを併用しない

証明モードを併用する

単なる定義 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では、戻り値の構造について単調減少な再帰呼び出しのみ許可される。

Page 7: Coqでsprintf

toStringの実装

• 非負整数Nから文字列への変換関数

• 再帰呼び出しでNの値が単調減少

Page 8: Coqでsprintf

toStringの実装

• 整数から文字列への変換関数

Page 9: Coqでsprintf

toStringの実装

• 実行例

Page 10: Coqでsprintf

sprintfの実装の準備

• 型と値のペアを定義する

Page 11: Coqでsprintf

sprintfの実装の準備

• {| TV_T := nat ; TV_V := 10 |}

• {| TV_T := string ; TV_V := “Hello” |}

Page 12: Coqでsprintf

sprintfの実装

• sprintf_impl

– 書式文字列に対する再帰で書く

– 構造帰納法なので停止性証明は不要

• “%04d”などの複雑な書式文字列に対応したい場合、停止性証明を導入する必要性が生じそう

Page 13: Coqでsprintf

sprintfの実装

• 帰納法&マッチング

Page 14: Coqでsprintf

sprintfの実装

• 実行例

• sprintf “Hello, world!”

– → “Hello, world!”

• sprintf “%d + %d = %d” (1) (2) (1+2)

– → “1 + 2 = 3”

• sprintf “Hello, %s!” “Masaki”

– → “Hello, Masaki”

Page 15: Coqでsprintf

おまけ

emacsで:wしたら強制終了するマクロを作るっていうネタあるんですけど使う人居ますか[2012/08/11 22:28:45] qnighy (原将己): vimでC-x C-sしたら強制終了っていう逆のネタもあります

Page 16: Coqでsprintf

おまけ

• 「VimでEmacsの保存コマンド→死亡」を実装してみました

Page 17: Coqでsprintf

おまけ

• といっても以下の2つを実行するだけ

• :map <C-x><C-s> :qall!<Enter>

• :map! <C-x><C-s> :qall!<Enter>

• SLでは物足らないあなたに…