Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Coqでsprintf

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 Coqでsprintf

upcamp 2012 ハッカソン発表会にて

Avatar for Masaki Hara

Masaki Hara

August 12, 2012
Tweet

More Decks by Masaki Hara

Other Decks in Programming

Transcript

  1. Coqでsprintf • printf(“%s : %d¥n”, “Coq”, strlen(“Coq”)); • 第二引数以降の型が、第一引数に依存! •

    依存型のわかりやすい例 • sprintf “Hello” – (string)型を返して欲しい • sprintf “There are %d pens.” – (Z -> string)型を返して欲しい • 引数によって戻り値の型が異なる
  2. Coqでsprintf • Coqにおける文字・文字列 – 文字(ascii) : 8ビットのタプル – 文字列(string) :

    asciiからなるリスト構造 • Coqにおける整数 – 自然数(nat) : ペアノの公理による非負整数 – 整数(Z) : 2進数表現による整数
  3. 関数定義の命令 証明モードを併用しない 証明モードを併用する 単なる定義 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では、戻り値の構造について単調減少な再帰呼び出しのみ許可さ れる。
  4. sprintfの実装の準備 • {| TV_T := nat ; TV_V := 10

    |} • {| TV_T := string ; TV_V := “Hello” |}
  5. sprintfの実装 • 実行例 • sprintf “Hello, world!” – → “Hello,

    world!” • sprintf “%d + %d = %d” (1) (2) (1+2) – → “1 + 2 = 3” • sprintf “Hello, %s!” “Masaki” – → “Hello, Masaki”