view agda-prog.ind @ 1:888cc58ced9d

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 28 Nov 2013 18:48:14 +0900
parents aa359e82dab7
children 576a3272522d
line wrap: on
line source

-title: Agda での Programming 技術

--abstract:

Agda は、Haskell 上の Dependent type に基づく証明支援系である。
Agda での証明は型付きλ式であり、証明するべき式も型付きλ式になっている。
したがって、Agda での証明は、本質的にはλ式を構築していく作業になる。

この発表ではAgdaの入門と、Emacs 上で行われる Agda のプログラミング技術
について圏論の例題を用いながら紹介する。Dependent type に関する論文は
多いが、ここでは Agda の証明を構成するために使われる技術を紹介していく。

プログラミング言語と異なり、Agdaの証明を書き上げても、それが動くことはない。
その意味では、Agdaの証明はプログラミングとは異なる。しかし、型宣言を
行い、その型に沿ったλ式を書いていくという点ではプログラミングそのもの
である。

Agdaの証明は、Curry Howard対応に基づいており、
すべては、型を表す式と、その型を持つλ式の組で表される。
Dependent type の特徴は省略可能な引数(暗黙の引数)にあり、
これは、通常のプログラミング言語にはない概念である。


証明を構成する作業は、型に沿って行われる。Agda には、未定部分を ? と
しして指定すると、その部分に相当する型をλ式として表示してくれる。
これにより、証明の指針が得られる。

証明は型が十分に与えら得ていることが必要であり、未定の部分が含まれている
場合には Agda は、その部分を黄色で表示する。これを解決するには、暗黙の
引数を表示してやると良い。

また、Agda の特徴である式変形を明示する推論に対するいくつかの手法に
関しても考察する。

--証明支援系

Monad とか Kan extension とかを知らないと関数型プログラミングできない

Monad の結合性を示すだけでも煩雑な計算が必要

高階述語論理

ハイティング代数

Curry Howard 対応

Coq

例題としての圏論

--人による証明

数学の本に書いてある証明

省略された部分

問題を解いてわかる部分

手書きの証明

清書された証明

Proof System 上の証明

理解するとはどういうこと?

モデルを理解する

証明を理解する

パターンを理解する

--Agda



Lambda 式

変数の定義

変数の型

データ型

レコード型

等号

   データ型を使った等号
   関係を表す集合としての等号

集合のレベル

暗黙の引数

emacs との連携

--Agda での証明方法

? の使い方

数式変形

数式変形の記述

数式変形用に ? を使う

record の使い方

数学的構造の存在を示す

record での変数の位置の選択

これから証明する部分の扱い

eval の使い方

Agda では証明できないもの

外延性

合同性

a=b は証明できない。

赤を解決する(型の矛盾)

黄を解決する(十分限定されていない変数)

暗黙の変数を明示する

再利用性

module parameter と、lemma の入力

Mono morphism から来る問題

--Agda の有効性

Haskell の構文との親和性

証明の完成度がわかる

証明の対称性を視認できる

Unification により証明を見つけることができる

すべて人手

式変形を明示できる

証明は極めて個人的

勝手な記号

勝手なrecord

勝手な module parameter

理論の理解に使う Monad とか Kan extension とか

--今後の展開

プログラミングと証明を同時に行う