View
327
Download
0
Category
Preview:
DESCRIPTION
Explanation of (a small portion of) Abella proof assistant in Japanese.
Citation preview
べらべらAbella
@chiguri
ProofSummit2013
御清聴誠に感謝しております!
お前誰だよ
• 3月に無事博士号を 取得した元学生
•パンダ –鶏付き
•通称chiguri
•今神奈川大学
御清聴誠に感謝しております!
明日のなごやちまつりで
•ぐだぐだとAgdaを話す予定
御清聴誠に感謝しております!
7月某日
• ML:「Abella2.0出たよ」
• chiguri:「ふうん・・・今度調べよっと」 (結局ほとんど 調べてません)
御清聴誠に感謝しております!
数日後
• 「ProofSummitで話せ?」
•「Yes, Sir!」
9割くらい フィクションです
御清聴誠に感謝しております!
二つの偶然が重なり
• Abellaを話すことにした – ちまつりでAgda話すし
–去年のCPPにも出てきたし
–ちょっと使ったことあるし
•一応今も使ってる
• うまく話せるか分からないけど
御清聴誠に感謝しております!
今日の話の視点
•主にCoqユーザから見たAbella –特にプログラミング側
• 2.0?なんの話ですかね。
御清聴誠に感謝しております!
Abellaって?
• http://abella-prover.org/
•ミネソタ大・INRIA Saclay・Ecole Polytechniqueで開発 –実装はOCaml(OPAMで入る)
御清聴誠に感謝しております!
Abellaの原理
•論理型プログラミング言語と論理による証明器 –二段階論理(two-level logic)
–c.f. Coq/Agdaは関数型言語 » 構成的型理論とCurry-Howard対応って言わないとダメです?
御清聴誠に感謝しております!
Abellaの二段階論理
御清聴誠に感謝しております!
λ-Prolog
System G
Specification Logic
Reasoning Logic
今回の話は
御清聴誠に感謝しております!
λ-Prolog
System G
Specification Logic
Reasoning Logic
Specification Logic
• λ-Prologのサブセット –もう少し詳しく言うと、hereditary Harrop Formulaとlambda-tree syntax
•だけどここでは説明しない
–目的はそこじゃない
–hereditary~は英語のwikipediaにある
御清聴誠に感謝しております!
Coqerから見たAbella
• 論理型言語だけど、慣れれば 大したことない –少し覚えれば関数っぽく書ける
• Coqで意味をPropで書くようなもの
• 証明は慣れないが、そこはなんとかする –エラーメッセージもマニュアルもあまり親切じゃない
御清聴誠に感謝しております!
Abellaのソース構成
• xxx.sig –signature:型、コンストラクタ、述語の型宣言
• xxx.mod –module:述語の推論規則
• xxx.thm –theorem:性質の証明
御清聴誠に感謝しております!
Abellaの型
• 型の宣言 –kind nat type.
• コンストラクタの宣言 –type z nat.
–type s nat -> nat.
• 名称の最初は大文字不可
御清聴誠に感謝しております!
注意
•型は代数的データ構造とほぼ同じだが、構造帰納法は使えない –その場合「natである」という述語を作る必要がある
•原則として「述語に関する帰納法」しか使えない
御清聴誠に感謝しております!
Abellaの述語
•述語の型: 引数 -> 引数 -> ... -> o
• oが命題を表す型 –o ≈ CoqにおけるProp
• Reasoning logicではpropという型が
–引数を与えると命題として使える
御清聴誠に感謝しております!
例えばこんな
•シグネチャ
–type is_nat nat -> o.
–type even nat -> bool -> o.
•推論
–is_nat z.
–is_nat (s N) :- is_nat N.
御清聴誠に感謝しております!
特徴を二つ
• 資料作成のやる気時間の問題
• Coqerがうらやましいなあ、と思うやつ
御清聴誠に感謝しております!
特徴1
•高階抽象構文(HOAS)が 使える –Isabelleユーザは知ってるはず
• Isabelle/HOLで使えるらしい
–CoqやAgdaでは不可能
• Positivity conditionに引っかかる
• Parametric HOASがあるにはあるが、あの
使いにくさときたら・・・ぶつぶつ
御清聴誠に感謝しております!
HOAS
•表現したい言語の変数を使っている言語の変数で表す –例:ラムダ計算の変数をλ-Prologの変数で表現
御清聴誠に感謝しております!
ラムダ計算を言語で 表現するとき
•変数どうしよう? –頭の痛い問題の一つ
–文字列?
–自然数? • de Bruijn index?
•束縛関係や置き換えの面倒くささがエラーとつらみを誘う
御清聴誠に感謝しております!
ラムダ式の束縛
• λx. xを考えると、ほしいのは –λの後のxと後ろのxが関係する
–置換するときは後ろのxが置き換えられる
–画面出力?置いておいてください。
御清聴誠に感謝しております!
じゃあ
• fun x : term => x – termはλ項とする
–型はterm -> term •何かλ項を与えるとそれがそのまま返ってくる
• 一応ラベルとしてコンストラクタを使用する – lam (fun x : term => x)
御清聴誠に感謝しております!
λ項の定義
•適用 –app : term * term -> term
•抽象 –lam : (term -> term) -> term
•以上!
御清聴誠に感謝しております!
λ-Prologでは
•適用しか書かない・・・ –不思議とどの例を見ても抽象が見あたらない
–多分書ける・・・はず・・・
御清聴誠に感謝しております!
HOASは
•別にラムダ式には限らない –変数束縛を記述言語に任せるのが本質
–局所変数などを表現するのも可能
•言語などの表現に限る気はする
御清聴誠に感謝しております!
特徴2
•推論、終わらなくてもいいよ
•えっ
御清聴誠に感謝しております!
お馬鹿なeven
• even z t.
• even (s N) B :- odd N B.
• odd z f.
• odd N B :- even (s N) B
• 1より大きい自然数で推論不能 –お馬鹿なのはoddだけど
御清聴誠に感謝しております!
evenと何かの 乗算結果はeven
•お馬鹿なevenでもこれが証明できる –証明が変なのだが
•普通なら、「同じ値を二回足したら偶数」などの補題が必要
• 0のケースしか出ない
御清聴誠に感謝しております!
どういうことか
•推論が仮定にある
•推論ができる
御清聴誠に感謝しております!
つまり
• even N tという仮定があるとしたら、 –推論が終わって
–判定がtとなる
–そんなNだった
•ということ –そうじゃないNなんて知らない
御清聴誠に感謝しております!
全域性
• forall N, {is_nat N} -> exists B, {is_bool B} -> {even N B}
–「全ての入力(と思ってる変数)に対して出力(と思ってる何か)が存在する」 • これだけでは必ず停止するとも一意になるとも言っていないが
– is_natに関する帰納法を用いて証明する • existsの位置を間違えると帰納法が使えないので注意
• is_bool忘れたら証明が進まないのでさらに注意
御清聴誠に感謝しております!
今日の話はこんなところ
御清聴誠に感謝しております!
他にも
• Reasoning Logicの側ではnabla-quantifierという面白いものも –常に「今まで出てきた値と異なる」ものを表す
• Lispのgensymみたいなことができる
御清聴誠に感謝しております!
2.0何が変わった?
• 高階仕様がサポートされたよ • 文脈依存の命題の証明が変わったよ
• 日本語でおk(特に後者) •アナウンス英語ですけどね •例がexamplesのどこかにある(だけ)らしいのだが始めて5分であきらめた
御清聴誠に感謝しております!
Abellaでやってること
•昔(といっても二年前)作った計算の合流性の証明 –HOAS便利すぐる
–Complete Developmentという 手法を使おうとしているが・・・
• parallel betaの証明時に面倒なことを回避
御清聴誠に感謝しております!
Recommended