SlideShare a Scribd company logo
書くネタがCoqしかない

  upcamp 2012 にて
自己紹介
• http://qnighy.github.com/ を参照
• いちねんせい
• 2008プログラミング組
やりたいこと
• 数学の証明を自然言語で書かなければい
  けないのは理不尽!
• →Principia Mathematica




     1+1の証明 (Wikipediaより)
     ここまで80ページ強の議論が必要
やりたいこと
• 今だったらこれをコンピューターでやれ
  るよね
• ↑正しさの検証も自動でできる!
• ↑あわよくば、証明の一部は自動化
目次
•   Coqとは何か
•   Coqの根底にある理論
•   Coqで何ができるのか
•   Coqをはじめる
Coqとは何か
• 純粋関数型プログラミング言語&定理証
  明言語
• 静的型付け
• OCamlの影響を受ける
• OCamlで実装されている
• OCamlの製造元 INRIA が開発している
• 名前は計算機科学者 Thierry Coqandに由来
  すると思われる
Coqの特徴
• 停止する保証のあるプログラムしか書け
  ない
  (再帰の記述に関する制限)
• 証明モード
  (対話的にプログラムを組み立てるモード)
コード例
• Karatsuba 乗算のコード




• このあと停止性証明が続く
コード例
• マージソートと停止性証明
Coqの特徴
• 停止する保証のあるプログラムしか書け
  ない
• (再帰の記述に関する制限)
• →プログラムの正当性証明に用いられる
コード例
• プログラムの正当性証明
• (anarchy proof 30: Certified Compiler)
Coqの特徴
• 停止する保証のあるプログラムしか書け
  ない
• (再帰の記述に関する制限)
• →プログラムの正当性証明に用いられる
• →数学の定理の証明に用いられる
コード例
• Glivenkoの定理の証明
コード例
• √2は無理数であることの証明
• (anarchy proof 6: Sqrt 2)
Coqの根底にある理論
• Coqにおける「証明」とは?
• → Curry-Howard 対応

     証明 : 命
     題
プログラム : 型
Coqの根底にある理論
•   Curry-Howard対応の例
•   含意(AならばB): 関数 A -> B (Haskell)
•   連言(AかつB): ペア pair<A, B> (C++)
•   選言(AまたはB): Either A B (Haskell)
•   矛盾(⊥): 到達不能型 Nothing (Scala)
•   否定(Aでない): A -> ⊥
Coqの根底にある理論
•   では、こういうコードは?
•   Definition A : False := A.
•   Aが定義できたら、矛盾が導けてしまう。
•   ↑ 無限ループの禁止
Coqの根底にある理論
• Coqは停止するプログラムしか書けない
• これをどう保証するか?

     • _人人 人人人人人人_
       > 型システムの出番 <
        ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
Coqの根底にある理論
•   停止性を保証する型システム
•   Simply Typed Lambda Calculus
•   ↓ +polymorphism (型に依存した値)
•   ↓ +type operators (型に依存した型)
•   ↓ +dependent types (値に依存した型)
•   Calculus of Constructions
Coqの根底にある理論
• Calculus of Constructions (CoC)
• ↓ + 再帰等
• Calculus of Inductive Constructions (CIC)

• このCICをCoqでは用いている
• CICと集合論のZFCは互換
  ( CIC(i)→ZFC(i-2), ZFC(i)→CIC(i+1) )
Coqで何ができるの?
• 数学サイド
• 有名なのは
 – ゲーデルの不完全性定理の証明
   (公理系が多層化するので、形式的な言語で書
   いたほうが議論しやすいと思われる)
 – 四色問題の証明
   (四色問題は数学的証明部とコンピューターに
   よる探索部に別れる。Coqではこれを有機的
   に結合できるため、証明の信頼性が高まる)
Coqで何ができるの?
• プログラミングサイド
• プログラムを証明するという試みもいく
  つか行われている
 – Coq自体でプログラムを書く→他の言語へ出力
 – C言語プログラムの証明:Frama-Cプラグイン
 – Javaプログラムの証明: Krakatoa
 – 独自の言語Why3MLで書いたプログラムの証
   明
• Zとかに比べるとまだ発展途上かも
Coqで何ができるの?

•というより
Coqで何ができるの?

•証明ができると
Coqで何ができるの?

•幸せになります
(主に自己肯定感が得られる)
Coqをはじめる
•
Coqをはじめる
• 日本語資料が少ない
• コミュニティーが大きくない

• 最後に、いくつかの参考資料を紹介して
  終わります
Coqの資料
• http://coq.inria.fr/
  – Coq公式サイト
• プログラミング Coq
  – 女子大生によるCoqプログラミング入門
• anarchy proof
  – 証明ジャッジ 練習用に使える
• あとは面倒くさいのでここを見て
コミュニティー
• 名古屋にいろいろあるらしい
 – Coq Party, Proof Summit …
本
• 本(英語)
 – Coq’art
    • Coqの本らしい
 – TAPL
    • 型理論の本
おわり
•

More Related Content

What's hot

SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
MITSUNARI Shigeo
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド
Yoshihiro Mizoguchi
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
 
競技プログラミングで便利な外部ツールを大量紹介
競技プログラミングで便利な外部ツールを大量紹介競技プログラミングで便利な外部ツールを大量紹介
競技プログラミングで便利な外部ツールを大量紹介
xryuseix
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
Masahiro Sakai
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
mametter
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
AtCoder Inc.
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
AtCoder Inc.
 
arc047
arc047arc047
arc047
AtCoder Inc.
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
Masaki Hara
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
Nobuyuki Matsui
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
 

What's hot (20)

No skk, no life.
No skk, no life.No skk, no life.
No skk, no life.
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
計算量
計算量計算量
計算量
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド圏論のモナドとHaskellのモナド
圏論のモナドとHaskellのモナド
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
競技プログラミングで便利な外部ツールを大量紹介
競技プログラミングで便利な外部ツールを大量紹介競技プログラミングで便利な外部ツールを大量紹介
競技プログラミングで便利な外部ツールを大量紹介
 
自動定理証明の紹介
自動定理証明の紹介自動定理証明の紹介
自動定理証明の紹介
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについて
 
AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説AtCoder Beginner Contest 014 解説
AtCoder Beginner Contest 014 解説
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
 
arc047
arc047arc047
arc047
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
良いコードとは
良いコードとは良いコードとは
良いコードとは
 
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
 

Similar to 書くネタがCoqしかない

すごいCoq入門
すごいCoq入門すごいCoq入門
すごいCoq入門
真一 北原
 
Proof summit 2017 for slideshare
Proof summit 2017 for slideshareProof summit 2017 for slideshare
Proof summit 2017 for slideshare
Keisuke Yahata
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
Akira Takahashi
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Yoshifumi Kawai
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
Yoshifumi Yamaguchi
 
111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッション111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッションShohei Hido
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
npsg
 
CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006
CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006
CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006
Kazuhiro Uchimura
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
MITSUNARI Shigeo
 
CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩
淳 千葉
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03
Miya Kohno
 
cbt (Cranberries Build Tool)
cbt (Cranberries Build Tool)cbt (Cranberries Build Tool)
cbt (Cranberries Build Tool)
Wada Yuki
 
Draft: Observability, Service Mesh and Microservices
Draft: Observability, Service Mesh and MicroservicesDraft: Observability, Service Mesh and Microservices
Draft: Observability, Service Mesh and Microservices
Taiki
 
Observability, Service Mesh and Microservices
Observability, Service Mesh and MicroservicesObservability, Service Mesh and Microservices
Observability, Service Mesh and Microservices
Taiki
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
Masaya Aoyama
 

Similar to 書くネタがCoqしかない (16)

C++ Now 2012 report
C++ Now 2012 reportC++ Now 2012 report
C++ Now 2012 report
 
すごいCoq入門
すごいCoq入門すごいCoq入門
すごいCoq入門
 
Proof summit 2017 for slideshare
Proof summit 2017 for slideshareProof summit 2017 for slideshare
Proof summit 2017 for slideshare
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニーUnity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
 
111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッション111015 tokyo scipy2_ディスカッション
111015 tokyo scipy2_ディスカッション
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
 
CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006
CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006
CI/CDパイプラインを定着させる闘い @九州インフラ交流勉強会(Kixs) Vol.006
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩CodeBuildを身近にするためのはじめの一歩
CodeBuildを身近にするためのはじめの一歩
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03
 
cbt (Cranberries Build Tool)
cbt (Cranberries Build Tool)cbt (Cranberries Build Tool)
cbt (Cranberries Build Tool)
 
Draft: Observability, Service Mesh and Microservices
Draft: Observability, Service Mesh and MicroservicesDraft: Observability, Service Mesh and Microservices
Draft: Observability, Service Mesh and Microservices
 
Observability, Service Mesh and Microservices
Observability, Service Mesh and MicroservicesObservability, Service Mesh and Microservices
Observability, Service Mesh and Microservices
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 

More from Masaki Hara

You won't know it's now Rust
You won't know it's now RustYou won't know it's now Rust
You won't know it's now Rust
Masaki Hara
 
How I Contribute to Rust Compiler
How I Contribute to Rust CompilerHow I Contribute to Rust Compiler
How I Contribute to Rust Compiler
Masaki Hara
 
Coqの公理
Coqの公理Coqの公理
Coqの公理
Masaki Hara
 
ご静聴ありがとうございました
ご静聴ありがとうございましたご静聴ありがとうございました
ご静聴ありがとうございましたMasaki Hara
 
いろいろな問題の解説
いろいろな問題の解説いろいろな問題の解説
いろいろな問題の解説
Masaki Hara
 
“A ::= aAa / a” in PEG
“A ::= aAa / a” in PEG“A ::= aAa / a” in PEG
“A ::= aAa / a” in PEG
Masaki Hara
 
Spaceships 解説
Spaceships 解説Spaceships 解説
Spaceships 解説
Masaki Hara
 
Proving Decidability of Intuitionistic Propositional Calculus on Coq
Proving Decidability of Intuitionistic Propositional Calculus on CoqProving Decidability of Intuitionistic Propositional Calculus on Coq
Proving Decidability of Intuitionistic Propositional Calculus on Coq
Masaki Hara
 
永続データ構造が分からない人のためのスライド
永続データ構造が分からない人のためのスライド永続データ構造が分からない人のためのスライド
永続データ構造が分からない人のためのスライド
Masaki Hara
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
Masaki Hara
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
Masaki Hara
 
joi2012-sp-day2-broadcasting
joi2012-sp-day2-broadcastingjoi2012-sp-day2-broadcasting
joi2012-sp-day2-broadcasting
Masaki Hara
 

More from Masaki Hara (12)

You won't know it's now Rust
You won't know it's now RustYou won't know it's now Rust
You won't know it's now Rust
 
How I Contribute to Rust Compiler
How I Contribute to Rust CompilerHow I Contribute to Rust Compiler
How I Contribute to Rust Compiler
 
Coqの公理
Coqの公理Coqの公理
Coqの公理
 
ご静聴ありがとうございました
ご静聴ありがとうございましたご静聴ありがとうございました
ご静聴ありがとうございました
 
いろいろな問題の解説
いろいろな問題の解説いろいろな問題の解説
いろいろな問題の解説
 
“A ::= aAa / a” in PEG
“A ::= aAa / a” in PEG“A ::= aAa / a” in PEG
“A ::= aAa / a” in PEG
 
Spaceships 解説
Spaceships 解説Spaceships 解説
Spaceships 解説
 
Proving Decidability of Intuitionistic Propositional Calculus on Coq
Proving Decidability of Intuitionistic Propositional Calculus on CoqProving Decidability of Intuitionistic Propositional Calculus on Coq
Proving Decidability of Intuitionistic Propositional Calculus on Coq
 
永続データ構造が分からない人のためのスライド
永続データ構造が分からない人のためのスライド永続データ構造が分からない人のためのスライド
永続データ構造が分からない人のためのスライド
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
joi2012-sp-day2-broadcasting
joi2012-sp-day2-broadcastingjoi2012-sp-day2-broadcasting
joi2012-sp-day2-broadcasting
 

書くネタがCoqしかない