Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Coqでsprintf

1.530 Aufrufe

Veröffentlicht am

upcamp 2012にて

Veröffentlicht in: Technologie
  • Login to see the comments

  • Gehören Sie zu den Ersten, denen das gefällt!

Coqでsprintf

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

×