SlideShare a Scribd company logo
証明プログラミング超入門
2015/01/24 情報科学若手の会冬の陣
門脇 香子(@kdxu)
自己紹介
• 門脇 香子 (@kdxu)
• お茶の水女子大学 浅井研 M1
• 好きなもの : 型と自転車と音楽
• http://kodoku.tokyo
概要
• 証明プログラミングとは?
• Agda による例(布教)

目標 : 高校数学レベルの簡単な証明
• (時間が余れば)ライブコーディング
証明プログラミングとは?
• ある種の性質を保障したプログラムが書ける

数学の定理を証明したり,停止性などの性質が保障された
コンパイラなどを実装できる
• コードの停止性,正当性などを証明できる

活用例 : OpenSSLの脆弱性の発見 

    CompCert(安全性が保証されたCコンパイラ)
• テストではなく証明で正しさを保証する!
• 安全,COOL,AWESOME !
Agda について
• もっとも有名な定理証明支援系の1つ
• 依存型という型を使用できる
• Coq より「プログラミング言語」寄り
• Syntax としては Haskell に近い
• 証明を項として表し直接操作する
インストール&セットアップ
• 要 Haskell-Platform
• $ cabal install agda
• $ agda-mode setup
• 推奨エディタはAquamacsだそうです
書いてみよう
• まずA1.agdaというファイルを作り

module A1 agda

と先頭に書く.(ファイル名と同じにする)
• C-c C-l でloadできます
まずは型定義
• data で新しい型を定義できる
• indent に注意しましょう
• Set の部分集合としてのBool型という意味
まずは型定義
• 自然数の型
• ペアノの公理による定義
• zeroがNat型ということと,xがNat型ならsuc x
もNat型だということを示している
関数定義
• 普通の足し算の定義
• (suc m) + n = (suc (m + n))
• C-c C-n で関数を評価できます
関数定義
• 中値記法もできます
関数定義
何か証明してみよう
• Nat 型と Bool 型の簡単な定義はできた
• ここでなにか簡単な定理を証明してみます
• 同値性の証明をするならば同値関係のデータ型が必
要(equality)

-> どのように定義するのか?
同値性
• 2つのものが同じということは,以下のように定義できる
• 例 : zero (suc zero) はダメ

x x の形をしていない.型はあるが,値が存在しない

なので,reflという型にならない
• reflにハマる値が存在するか で定義できる
定理 = 関数
• 例えば 0 + n n を示したい

-> 返り値がreflとなるように関数を書ければよい
• 関数の型は

(n : Nat) -> (0 + n n)

となる
• ここで suc 関数に対する再帰的処理が必要になる
定理 = 関数
• これを Agda は 型が等しい と判断してくれない
• ここで suc 関数に対する再帰的処理が必要になる
• 一般的に定理を再帰的に示す関数 cong を定義

証明完了!
• zero と suc nで場合分けしている (C-c C-c n)

zero の場合は zero + zero は zeroなので直ちにrefl

suc n の場合は n に関して再帰的に証明をする
Tips : 依存型
• Agda では依存型(Dependent Types)という型が使えます
• 「値に依存する型」を作ることができる型
• 例 Vec N 型
• 型の段階で長さの比較や空リスト判定を保証できる
おすすめ教材
• Ulf Norell 氏の Dependently Typed Programming in
Agda 

(http://www.cse.chalmers.se/ ulfn/darcs/AFP08/
LectureNotes/AgdaIntro.pdf)
• Brutal [Meta]Introduction to Dependent Types in
Agda 

(http://oxij.org/note/BrutalDepTypes/)
• お茶大製「みんなのAgda wiki」

(http://agda.wiki.fc2.com/)
研究紹介
• 私は今日紹介した Agda という言語を用いて安全
な型推論器を構成しています
• 依存型の性質を用いて型変数の番号をうまく管理す
ることで,セルの書き換えを用いずにUnification
を行うことにより実装しています
• https://github.com/kdxu/InferAgda
おわり
証明ができると世界が開けます.

証明プログラミングを楽しみましょう!

More Related Content

What's hot

ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks
 
ホモトピー型理論入門
ホモトピー型理論入門ホモトピー型理論入門
ホモトピー型理論入門
k h
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門Kawamoto_Kazuhiko
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門
joisino
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界maruyama097
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
hoxo_m
 
ゼロから始めるQ#
ゼロから始めるQ#ゼロから始めるQ#
ゼロから始めるQ#
Takayoshi Tanaka
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
Life Robotics
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
Takami Sato
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!
遺伝的アルゴリズム(Genetic Algorithm)を始めよう!遺伝的アルゴリズム(Genetic Algorithm)を始めよう!
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!
Kazuhide Okamura
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
Ken'ichi Matsui
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safeKumazaki Hiroki
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
natrium11321
 
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
Megagon Labs
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
Hiroshi Yamashita
 
よくわかるCoqプログラミング
よくわかるCoqプログラミングよくわかるCoqプログラミング
よくわかるCoqプログラミング
Real_analysis
 

What's hot (20)

ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
ホモトピー型理論入門
ホモトピー型理論入門ホモトピー型理論入門
ホモトピー型理論入門
 
グラフィカルモデル入門
グラフィカルモデル入門グラフィカルモデル入門
グラフィカルモデル入門
 
最適輸送入門
最適輸送入門最適輸送入門
最適輸送入門
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
 
ゼロから始めるQ#
ゼロから始めるQ#ゼロから始めるQ#
ゼロから始めるQ#
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
協働ロボットCOROの開発における形式的仕様記述KMLの開発と適用
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!
遺伝的アルゴリズム(Genetic Algorithm)を始めよう!遺伝的アルゴリズム(Genetic Algorithm)を始めよう!
遺伝的アルゴリズム (Genetic Algorithm)を始めよう!
 
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
数学カフェ 確率・統計・機械学習回 「速習 確率・統計」
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
よくわかるCoqプログラミング
よくわかるCoqプログラミングよくわかるCoqプログラミング
よくわかるCoqプログラミング
 

Similar to 証明プログラミング超入門

すごいCoq入門
すごいCoq入門すごいCoq入門
すごいCoq入門
真一 北原
 
Anomaly Detector で遊ぼう♪ with Azure Time Series Insights
Anomaly Detector で遊ぼう♪ with Azure Time Series InsightsAnomaly Detector で遊ぼう♪ with Azure Time Series Insights
Anomaly Detector で遊ぼう♪ with Azure Time Series Insights
Kazumi IWANAGA
 
JaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションJaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッション
mirer
 
20151021 cookpad talk_test_engineer
20151021 cookpad talk_test_engineer20151021 cookpad talk_test_engineer
20151021 cookpad talk_test_engineer
Kazuaki Matsuo
 
読書会Vol6
読書会Vol6読書会Vol6
読書会Vol6
Mari Takahashi
 
20120529 アジャイルサムライ読書会第6回
20120529 アジャイルサムライ読書会第6回20120529 アジャイルサムライ読書会第6回
20120529 アジャイルサムライ読書会第6回
株式会社コネクトスター(ConnectStar Co., Ltd.)
 
プログラマ人生論
プログラマ人生論プログラマ人生論
プログラマ人生論
ymmt
 

Similar to 証明プログラミング超入門 (7)

すごいCoq入門
すごいCoq入門すごいCoq入門
すごいCoq入門
 
Anomaly Detector で遊ぼう♪ with Azure Time Series Insights
Anomaly Detector で遊ぼう♪ with Azure Time Series InsightsAnomaly Detector で遊ぼう♪ with Azure Time Series Insights
Anomaly Detector で遊ぼう♪ with Azure Time Series Insights
 
JaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションJaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッション
 
20151021 cookpad talk_test_engineer
20151021 cookpad talk_test_engineer20151021 cookpad talk_test_engineer
20151021 cookpad talk_test_engineer
 
読書会Vol6
読書会Vol6読書会Vol6
読書会Vol6
 
20120529 アジャイルサムライ読書会第6回
20120529 アジャイルサムライ読書会第6回20120529 アジャイルサムライ読書会第6回
20120529 アジャイルサムライ読書会第6回
 
プログラマ人生論
プログラマ人生論プログラマ人生論
プログラマ人生論
 

証明プログラミング超入門