Mercurial > hg > Papers > 2018 > nozomi-master
comparison paper/agda.tex @ 85:9d154c48a1f6
Update curry-howard isomorphism
author | atton <atton@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 09 Feb 2017 15:36:52 +0900 |
parents | c0199291c58e |
children | e437746d6038 |
comparison
equal
deleted
inserted
replaced
84:f3ea67a23cf6 | 85:9d154c48a1f6 |
---|---|
346 | 346 |
347 それぞれの記号は以下のような意味を持つ | 347 それぞれの記号は以下のような意味を持つ |
348 \begin{itemize} | 348 \begin{itemize} |
349 \item $ \land $ | 349 \item $ \land $ |
350 conjunction。2つの命題が成り立つことを示す。 | 350 conjunction。2つの命題が成り立つことを示す。 |
351 $ A \land B $ と記述すると A かつ B と考えることができる。 | 351 $ A \land B $ と記述すると、 A かつ B と考えることができる。 |
352 | 352 |
353 \item $ \lor $ | 353 \item $ \lor $ |
354 disjunction。2つの命題のうちどちらかが成り立つことを示す。 | 354 disjunction。2つの命題のうちどちらかが成り立つことを示す。 |
355 $ A \lor B $ と記述すると A または B と考えることができる。 | 355 $ A \lor B $ と記述すると、 A または B と考えることができる。 |
356 | 356 |
357 \item $ \Rightarrow $ | 357 \item $ \Rightarrow $ |
358 implication。左側の命題が成り立つ時、右側の命題が成り立つことを示す。 | 358 implication。左側の命題が成り立つ時、右側の命題が成り立つことを示す。 |
359 $ A \Rightarrow B $ と記述すると A ならば B と考えることができる。 | 359 $ A \Rightarrow B $ と記述すると、 A ならば B と考えることができる。 |
360 \end{itemize} | 360 \end{itemize} |
361 | 361 |
362 例として、natural deduction で三段論法を証明する。 | 362 例として、natural deduction で三段論法を証明する。 |
363 なお、三段論法とは「A は B であり、 B は C である。よって A は C である」といった文を示す。 | 363 なお、三段論法とは「A は B であり、 B は C である。よって A は C である」といった文を示す。 |
364 | 364 |
365 \begin{prooftree} | 365 \begin{prooftree} |
366 \AxiomC{ $ [A] $ $_{(1)}$} | 366 \AxiomC{ $ [A] $ $_{(1)}$} |
367 \AxiomC{ [$ (A \Rightarrow B) \land (B \Rightarrow C)$] $_{(2)}$ } | 367 \AxiomC{ [$ (A \Rightarrow B) \land (B \Rightarrow C)$] $_{(2)}$ } |
368 \RightLabel{ $ \land 1 \mathcal{E} $ } | 368 \RightLabel{ $ \land 1 \mathcal{E} $ } |
369 \UnaryInfC{ $ (A \Rightarrow B) $ } | 369 \UnaryInfC{ $ (A \Rightarrow B) $ } |
370 \RightLabel{ $ \Rightarrow \mathcal{E} $} | |
370 \BinaryInfC{ $ B $ } | 371 \BinaryInfC{ $ B $ } |
371 | 372 |
372 \AxiomC{ [$ (A \Rightarrow B) \land (B \Rightarrow C)$] $_{(2)}$ } | 373 \AxiomC{ [$ (A \Rightarrow B) \land (B \Rightarrow C)$] $_{(2)}$ } |
373 \RightLabel{ $ \land 2 \mathcal{E} $ } | 374 \RightLabel{ $ \land 2 \mathcal{E} $ } |
374 \UnaryInfC{ $ (B \Rightarrow C) $ } | 375 \UnaryInfC{ $ (B \Rightarrow C) $ } |
375 | 376 |
377 \RightLabel{ $ \Rightarrow \mathcal{E} $} | |
376 \BinaryInfC{ $ C $ } | 378 \BinaryInfC{ $ C $ } |
377 \RightLabel{ $ \Rightarrow \mathcal{I} _{(1)}$} | 379 \RightLabel{ $ \Rightarrow \mathcal{I} _{(1)}$} |
378 \UnaryInfC{ $ A \Rightarrow C $} | 380 \UnaryInfC{ $ A \Rightarrow C $} |
379 \RightLabel{ $ \Rightarrow \mathcal{I} _{(2)}$} | 381 \RightLabel{ $ \Rightarrow \mathcal{I} _{(2)}$} |
380 \UnaryInfC{ $ ((A \Rightarrow B) \land (B \Rightarrow C)) \Rightarrow (A \Rightarrow C) $} | 382 \UnaryInfC{ $ ((A \Rightarrow B) \land (B \Rightarrow C)) \Rightarrow (A \Rightarrow C) $} |
400 これで残る alive な仮定は $ (A \Rightarrow B) \land (B \Rightarrow C)$ となり、これから $ A \Rightarrow C $ を導くことができたためにさらに $ \Rightarrow \mathcal{I} $ を適用する。 | 402 これで残る alive な仮定は $ (A \Rightarrow B) \land (B \Rightarrow C)$ となり、これから $ A \Rightarrow C $ を導くことができたためにさらに $ \Rightarrow \mathcal{I} $ を適用する。 |
401 結果、証明すべき論理式$ ((A \Rightarrow B) \land (B \Rightarrow C)) \Rightarrow (A \Rightarrow C) $ が導けたために証明終了となる。 | 403 結果、証明すべき論理式$ ((A \Rightarrow B) \land (B \Rightarrow C)) \Rightarrow (A \Rightarrow C) $ が導けたために証明終了となる。 |
402 | 404 |
403 % }}} | 405 % }}} |
404 | 406 |
405 % {{{ Curry-Howard Isomorphism TODO: もっと増やす(Agda でラムダ計算を説明する) | 407 % {{{ Curry-Howard Isomorphism |
406 \section{Curry-Howard Isomorphism} | 408 \section{Curry-Howard Isomorphism} |
407 \label{section:curry_howard_isomorphism} | 409 \label{section:curry_howard_isomorphism} |
408 \ref{section:natural_deduction}節では natural deduction における証明手法について述べた。 | 410 \ref{section:natural_deduction}節では Natural Deduction における証明手法について述べた。 |
409 natural deduction における証明はほとんど型付き $ \lambda $ 計算のような形をしている。 | 411 Natural Deduction はプログラム上では型付きのラムダ式として表現できる。 |
410 実際、Curry-Howard Isomorphism により Natural Deduction と型付き $ \lambda $ 計算は対応している。% ref TaPL 104 | 412 これは Curry-Howard Isomorphism と呼ばれ、 Natural Deduction と型付き $ \lambda $ 計算が同じ構造であることを表している。 |
411 Curry-Howard Isomorphism の概要を~\ref{section:curry_howard_isomorphism} 節に述べる。 | 413 Curry-Howard Isomorphism の概要を表~\ref{table:curry}に示す。 |
412 | |
413 関数型 $ \rightarrow $ のみに注目した時 | |
414 | |
415 \begin{enumerate} | |
416 \item 導入規則(T-ABS) は、その型の要素がどのように作られるかを記述する | |
417 \item 除去規則(T-APP) は、その型の要素がどのように作られるかを記述する | |
418 \end{enumerate} | |
419 | |
420 | |
421 例えば命題Aが成り立つためには A という型を持つ値が存在すれば良い。 | |
422 しかしこの命題は A という alive な仮定に依存している。 | |
423 natural deduction では A の仮定を dead にするために $ \Rightarrow \mathcal{I} $ により $ \Rightarrow $ を導入する。 | |
424 これが $ \lambda $ による抽象化(T-ABS)に対応している。 | |
425 | |
426 \begin{eqnarray*} | |
427 x : A \\ | |
428 \lambda x . x : A \rightarrow A | |
429 \end{eqnarray*} | |
430 | |
431 プログラムにおいて、変数 x は内部の値により型が決定される。 | |
432 特に、x の値が未定である場合は未定義の変数としてエラーが発生する。 | |
433 しかし、 x を取って x を返す関数は定義することはできる。 | |
434 これは natural deduction の $ \Rightarrow \mathcal{I} $ により仮定を discharge することに相当する。 | |
435 | |
436 また、仮定Aが成り立つ時に結論Bを得ることは、関数適用(T-APP)に相当している。 | |
437 | |
438 \begin{prooftree} | |
439 \AxiomC{$A$} | |
440 \AxiomC{$A \rightarrow B $} | |
441 \RightLabel{T-APP} | |
442 \BinaryInfC{$B$} | |
443 \end{prooftree} | |
444 | |
445 このように、 natural deduction における証明はそのまま 型付き $ \lambda $ 計算に変換することができる。 | |
446 | |
447 それぞれの詳細な対応は省略するが、表\ref{tbl:curry_howard_isomorphism} のような対応が存在する。 | |
448 | 414 |
449 \begin{center} | 415 \begin{center} |
450 \begin{table}[htbp] | 416 \begin{table}[htbp] |
451 \begin{tabular}{|c||c|c|} \hline | 417 \begin{tabular}{|c|c|} \hline |
452 & natural deduction & 型付き $ \lambda $ 計算 \\ \hline \hline | 418 Natural Deduction & 型付き $ \lambda $ 計算 \\ \hline \hline |
453 hypothesis & $ A $ & 型 A を持つ変数 x \\ \hline | 419 $ A $ & 型 A を持つ変数 x \\ \hline |
454 conjunction & $ A \land B $ & 型 A と型 B の直積型 を持つ変数 x \\ \hline | 420 $ A \Rightarrow B $ & 型 A を取り型 B の変数を返す関数 f \\ \hline |
455 disjunction & $ A \lor B $ & 型 A と型 B の直和型 を持つ変数 x \\ \hline | 421 $ \Rightarrow \mathcal{I} $ & ラムダの抽象化 \\ \hline |
456 implication & $ A \Rightarrow B $ & 型 A を取り型 B の変数を返す関数 f \\ \hline | 422 $ \Rightarrow \mathcal{E} $ & 関数適用 \\ \hline |
457 \end{tabular} | 423 $ A \land B $ & 型 A と型 B の直積型 を持つ変数 x \\ \hline |
458 \caption{natural deuction と 型付き $ \lambda $ 計算との対応(Curry-Howard Isomorphism)} | 424 $ \land \mathcal{I} $ & 型A,Bを持つ値から直積型へのコンストラクタ \\ \hline |
459 \label{tbl:curry_howard_isomorphism} | 425 $ \land 1 \mathcal{E} $ & 直積型からの型Aを取り出す射影fst \\ \hline |
460 \end{table} | 426 $ \land 2 \mathcal{E} $ & 直積型からの型Bを取り出す射影snd \\ \hline |
427 $ A \lor B $ & 型 A と型 B の直和型 を持つ変数 x \\ \hline | |
428 $ \lor \mathcal{I} $ & 型A,Bの値から直和型へのコンストラクタ \\ \hline | |
429 $ \lor \mathcal{E} $ & 直和型から型Cの値を返す関数f \\ \hline | |
430 \end{tabular} | |
431 \caption{natural deuction と 型付き $ \lambda $ 計算との対応(Curry-Howard Isomorphism)} | |
432 \label{table:curry} | |
433 \end{table} | |
461 \end{center} | 434 \end{center} |
435 | |
436 型付きラムダ計算における命題は型に相当する。 | |
437 例えば恒等関数id の型は $ \text{A} \rightarrow \text{A}$ という型を持つが、これは「Aが成り立つならAが成り立つ」という命題と等しい。 | |
438 命題の仮定は引数となって表れ、証明はその型を導くための式となる。 | |
439 | |
440 例えば Natural Deduction における三段論法は $ ((A \Rightarrow B) \land (B \Rightarrow C)) \Rightarrow (A \Rightarrow C) $ という形をしていた。 | |
441 仮定は $ ((A \Rightarrow B) \land (B \Rightarrow C)) $ となる。 | |
442 | |
443 直積に対応する型には直積型が存在する。 | |
444 Agda において直積型に対応するデータ構造 \verb/Product/ を定義するとリスト~\ref{src:agda-product}のようになる。 | |
445 例えば \verb/Int/ 型と \verb/String/ 型を取る直積型は \verb/Int/ $ \times $ \verb/String/ 型となる。 | |
446 これは二つの型を取る型であり、Natural Deduction の $ \land $ に相当する。 | |
447 | |
448 直積型から値を射影する関数 \verb/fst/ と \verb/snd/ を定義する。 | |
449 これらは Natural Deduction における $ \land 1 \mathcal{E} $ と $ \land 2 \mathcal{E} $ に相当する。 | |
450 | |
451 なお、直積型は型Aを持つフィールド\verb/fst/と型Bを持つフィールド\verb/snd/を持つレコード型と考えても良い。 | |
452 | |
453 \lstinputlisting[label=src:agda-product, caption=Agda における直積型] {src/AgdaProduct.agda} | |
454 | |
455 三段論法の証明は 「1つの仮定から $ \land 1 \mathcal{E} $ と $ \land 2 \mathcal{E} $ を用いて仮定を二つ取り出し、それぞれに $ \Rightarrow \mathcal{E} $ を適用した後に仮定を $ \Rightarrow \mathcal{I}$ で dead にする」形であった。 | |
456 | |
457 $ \Rightarrow \mathcal{I}$ に対応するのは関数適用である。 | |
458 よってこの証明は「一つの変数から \verb/fst/ と \verb/snd/ を使って関数を二つ取り出し、それぞれを関数適用する」という形になる。 | |
459 これをラムダ式で書くとリスト~\ref{src:agda-modus-ponens}のようになる。 | |
460 仮定 A $ \times $ B と仮定 A から A $ \rightarrow $ C を導いている。 | |
461 | |
462 \lstinputlisting[label=src:agda-modus-ponens, caption=Agda における三段論法の証明] {src/AgdaModusPonens.agda.replaced} | |
463 | |
464 このように Agda では証明を記述することができる。 | |
465 | |
462 % }}} | 466 % }}} |
463 | 467 |
464 % {{{ Reasoning | 468 % {{{ Reasoning |
465 | 469 |
466 \section{Reasoning} | 470 \section{Reasoning} |
467 次に Agda における証明を記述していく。 | 471 次に依存型を利用して等式の証明を記述していく。 |
472 | |
468 例題として、自然数の加法の可換法則を示す。 | 473 例題として、自然数の加法の可換法則を示す。 |
469 | |
470 証明を行なうためにまずは自然数を定義する。 | 474 証明を行なうためにまずは自然数を定義する。 |
471 今回用いる自然数の定義は以下のようなものである。 | 475 今回用いる自然数の定義は以下のようなものである。 |
472 | 476 |
473 \begin{itemize} | 477 \begin{itemize} |
474 \item 0 は自然数である | 478 \item 0 は自然数である |