Mercurial > hg > Papers > 2018 > nozomi-master
comparison paper/agda.tex @ 55:70bea06ebdf3
Add reasoning
author | atton <atton@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 31 Jan 2017 17:30:07 +0900 |
parents | 9902994fbd1a |
children | 10a550bf7e4a |
comparison
equal
deleted
inserted
replaced
54:ef9730f3db8d | 55:70bea06ebdf3 |
---|---|
4 部分型を用いて具体的なCbCの型システムを定義する前に、型システムの一方のメリットである証明について触れる。 | 4 部分型を用いて具体的なCbCの型システムを定義する前に、型システムの一方のメリットである証明について触れる。 |
5 依存型という型を持つ証明支援系言語 Agda を用いて証明が行なえることを示す。 | 5 依存型という型を持つ証明支援系言語 Agda を用いて証明が行なえることを示す。 |
6 | 6 |
7 % {{{ Natural Deduction | 7 % {{{ Natural Deduction |
8 \section{Natural Deduction} | 8 \section{Natural Deduction} |
9 \label{section:natural_deduction} | |
9 まず始めに証明を行なうためにNatural Deduction(自然演繹)を示す。 | 10 まず始めに証明を行なうためにNatural Deduction(自然演繹)を示す。 |
10 | 11 |
11 証明には natural deduction(自然演繹)を用いる。 | 12 証明には natural deduction(自然演繹)を用いる。 |
12 natural deduction は Gentzen によって作られた論理と、その証明システムである~\cite{Girard:1989:PT:64805}。 | 13 natural deduction は Gentzen によって作られた論理と、その証明システムである~\cite{Girard:1989:PT:64805}。 |
13 命題変数と記号を用いた論理式で論理を記述し、推論規則により変形することで求める論理式を導く。 | 14 命題変数と記号を用いた論理式で論理を記述し、推論規則により変形することで求める論理式を導く。 |
275 \label{tbl:curry_howard_isomorphism} | 276 \label{tbl:curry_howard_isomorphism} |
276 \end{table} | 277 \end{table} |
277 \end{center} | 278 \end{center} |
278 % }}} | 279 % }}} |
279 | 280 |
281 % {{{ 依存型を持つ証明支援系言語 Agda | |
282 | |
280 \section{依存型を持つ証明支援系言語 Agda} | 283 \section{依存型を持つ証明支援系言語 Agda} |
281 型システムを用いて証明を行なうことができる言語に Agda が存在する。% ref Agda のref | 284 型システムを用いて証明を行なうことができる言語に Agda が存在する。% ref Agda のref |
282 Agda は依存型という強力な型システムを持っている。 | 285 Agda は依存型という強力な型システムを持っている。 |
283 依存型とは型も第一級オブジェクトとする型であり、型を引数に取る関数や値を取って型を返す関数、型の型などが記述できる。 | 286 依存型とは型も第一級オブジェクトとする型であり、型を引数に取る関数や値を取って型を返す関数、型の型などが記述できる。 |
284 この節では Agda の文法的な紹介を行なう~\cite{agda-documentation}。 % ref pdf のアレ | 287 この節では Agda の文法的な紹介を行なう~\cite{agda-documentation}。 % ref pdf のアレ |
390 具体的にはとある型 A における中置関数 \verb/_==_/ を定義することに相当する。 | 393 具体的にはとある型 A における中置関数 \verb/_==_/ を定義することに相当する。 |
391 | 394 |
392 \lstinputlisting[label=src:agda-type-class, caption=Agdaにおける部分型制約] {src/AgdaTypeClass.agda} | 395 \lstinputlisting[label=src:agda-type-class, caption=Agdaにおける部分型制約] {src/AgdaTypeClass.agda} |
393 | 396 |
394 ある型 T がこの部分型制約を満たすことを示すには、型 T でこのレコードを作成できることを示し、それを instance 構文で登録する。 | 397 ある型 T がこの部分型制約を満たすことを示すには、型 T でこのレコードを作成できることを示し、それを instance 構文で登録する。 |
395 型Nat が Eq の上位型であることを記述するとリスト~\ref{src-agda-instance}のようになる。 | 398 型Nat が Eq の上位型であることを記述するとリスト~\ref{src:agda-instance}のようになる。 |
396 | 399 |
397 \lstinputlisting[label=src:agda-instance, caption=Agdaにおける部分型関係の構築] {src/AgdaInstance.agda} | 400 \lstinputlisting[label=src:agda-instance, caption=Agdaにおける部分型関係の構築] {src/AgdaInstance.agda} |
398 | 401 |
399 これで \verb/Eq/ が要求される関数に対して Nat が適用できるようになる。 | 402 これで \verb/Eq/ が要求される関数に対して Nat が適用できるようになる。 |
400 例えば型 A の要素を持つ List A から要素を探してくる elem を定義する。 | 403 例えば型 A の要素を持つ List A から要素を探してくる elem を定義する。 |
429 そのモジュールは引数に型Aと二項演算子 \verb/</を取り、ソートする関数を提供する。 | 432 そのモジュールは引数に型Aと二項演算子 \verb/</を取り、ソートする関数を提供する。 |
430 \verb/Sort/モジュールを \verb/Nat/ と \verb/Bool/ で利用した例がリスト~\ref{src:agda-parameterized-module}である。 | 433 \verb/Sort/モジュールを \verb/Nat/ と \verb/Bool/ で利用した例がリスト~\ref{src:agda-parameterized-module}である。 |
431 | 434 |
432 \lstinputlisting[label=src:agda-parameterized-module, caption=Agda における Parameterized Module] {src/AgdaParameterizedModule.agda} | 435 \lstinputlisting[label=src:agda-parameterized-module, caption=Agda における Parameterized Module] {src/AgdaParameterizedModule.agda} |
433 | 436 |
437 % }}} | |
438 | |
439 % {{{ Reasoning | |
434 | 440 |
435 \section{Reasoning} | 441 \section{Reasoning} |
436 | 442 次に Agda における証明を記述していく。 |
443 例題として、自然数の加法の可換法則を示す。 | |
444 | |
445 証明を行なうためにまずは自然数を定義する。 | |
446 今回用いる自然数の定義は以下のようなものである。 | |
447 | |
448 \begin{itemize} | |
449 \item 0 は自然数である | |
450 \item 任意の自然数には後続数が存在する | |
451 \item 0 はいかなる自然数の後続数でもない | |
452 \item 異なる自然数どうしの後続数は異なる ($ n \neq m \rightarrow S n \neq S m $) | |
453 \item 0がある性質を満たし、aがある性質を満たせばその後続数 S(n) も自然数である | |
454 \end{itemize} | |
455 | |
456 この定義は peano arithmetic における自然数の定義である。 | |
457 | |
458 Agda で自然数型 Nat を定義するとリスト \ref{src:agda-nat-2} のようになる。 | |
459 | |
460 \lstinputlisting[label=src:agda-nat-2, caption=Agda における自然数型 Nat の定義] {src/Nat.agda} | |
461 | |
462 自然数型 Nat は2つのコンストラクタを持つ。 | |
463 | |
464 \begin{itemize} | |
465 \item O | |
466 | |
467 引数を持たないコンストラクタ。これが0に相当する。 | |
468 | |
469 \item S | |
470 | |
471 Nat を引数に取るコンストラクタ。これが後続数に相当する。 | |
472 | |
473 \end{itemize} | |
474 | |
475 よって、数値の 3 は \verb/S (S (S O))/ のように表現される。 | |
476 Sの個数が数値に対応する。 | |
477 | |
478 次に加算を定義する(リスト\ref{src:agda-nat-add})。 | |
479 | |
480 \lstinputlisting[label=src:agda-nat-add, caption=Agdaにおける自然数型に対する加算の定義] {src/NatAdd.agda} | |
481 | |
482 加算は中置関数 \verb/_+_/ として定義する。 | |
483 2つの Nat を取り、Natを返す。 | |
484 関数 \verb/_+_/ はパターンマッチにより処理を変える。 | |
485 0に対して m 加算する場合は m であり、 n の後続数に対して m 加算する場合は n に m 加算した数の後続数とする。 | |
486 S を左の数から右の数へ1つずつ再帰的に移していくような加算である。 | |
487 | |
488 例えば 3 + 1 といった計算は (S (S (S O))) + (S O) のように記述される。 | |
489 ここで 3 + 1 が 4と等しいことの証明を行なう。 | |
490 | |
491 等式の証明には agda の standard library における Relation.Binary.Core の定義を用いる。 | |
492 | |
493 \lstinputlisting[label=src:agda-equiv, caption= Relation.Binary.Core による等式を示す型 $ \equiv $] {src/Equiv.agda.replaced} | |
494 Agda において等式は、等式を示すデータ型 $ \equiv $ により定義される。 | |
495 $ \equiv $ は同じ両辺が同じ項に簡約される時にコンストラクタ refl で構築できる。 | |
496 | |
497 実際に 3 + 1 = 4 の証明は refl で構成できる(リスト\ref{src:agda-three-plus-one})。 | |
498 | |
499 \lstinputlisting[label=src:agda-three-plus-one, caption= Agda における 3 + 1 の結果が 4 と等しい証明] {src/ThreePlusOne.agda} | |
500 | |
501 3+1 という関数を定義し、その型として証明すべき式を記述し、証明を関数の定義として定義する。 | |
502 証明する式は \verb/(S (S (S O))) + (S O)≡(S (S (S (S O))))/ である。 | |
503 今回は \verb/_+_/ 関数の定義により \verb/ (S (S (S (S O)))) / に簡約されるためにコンストラクタ refl が証明となる。 | |
504 | |
505 $ \equiv $ によって証明する際、必ず同じ式に簡約されるとは限らないため、いくつかの操作が Relation.Binary.PropositionalEquality に定義されている。 | |
506 | |
507 \begin{itemize} | |
508 \item sym : $ x \equiv y \rightarrow y \equiv x $ | |
509 | |
510 等式が証明できればその等式の左辺と右辺を反転しても等しい。 | |
511 | |
512 \item cong : $ f \rightarrow x \equiv y \rightarrow f x \equiv f y $ | |
513 | |
514 証明した等式に同じ関数を与えても等式は保たれる。 | |
515 | |
516 \item trans : $ x \equiv y \rightarrow y \equiv z \rightarrow x \equiv z $ | |
517 | |
518 2つの等式に表れた同じ項を用いて2つの等式を繋げた等式は等しい。 | |
519 \end{itemize} | |
520 | |
521 ではこれから nat の加法の交換法則を証明していく(リスト\ref{src:agda-nat-add-sym})。 | |
522 | |
523 \lstinputlisting[label=src:agda-nat-add-sym, caption= Agda における加法の交換法則の証明] {src/NatAddSym.agda} | |
524 | |
525 証明する式は $ n + m \equiv m + n $ である。 | |
526 n と m は Nat であるため、それぞれがコンストラクタ O か S により構成される。 | |
527 そのためにパターンは4通りある。 | |
528 | |
529 \begin{itemize} | |
530 \item n = O, m = O | |
531 | |
532 + の定義により、 O に簡約されるため refl で証明できる。 | |
533 | |
534 \item n = O, m = S m | |
535 | |
536 $ O + (S m) \equiv (S m) + O $ を証明することになる。 | |
537 この等式は + の定義により $ O + (S m) \equiv S (m + O) $ と変形できる。 | |
538 $ S (m + O) $ は $ m + O $ に S を加えたものであるため、 cong を用いて再帰的に \verb/addSym/ を実行することで証明できる。 | |
539 | |
540 この2つの証明はこのような意味を持つ。 | |
541 n が 0 であるとき、 m も 0 なら簡約により等式が成立する。 | |
542 n が 0 であり、 m が 0 でないとき、 m は後続数である。 | |
543 よって m が (S x) と書かれる時、 x は m の前の値である。 | |
544 前の値による交換法則を用いてからその結果の後続数も + の定義により等しい。 | |
545 | |
546 ここで、 \verb/addSym/ に渡される m は1つ値が減っているため、最終的には n = 0, m = 0 である refl にまで簡約され、等式が得られる。 | |
547 | |
548 \item n = S n, m = O | |
549 | |
550 $ (S n) + O \equiv O + (S n) $ を証明する。 | |
551 この等式は + の定義により $ S (n + O) \equiv (S n) $ と変形できる。 | |
552 さらに変形すれば $ S (n + O) \equiv S (O + n) $ となる。 | |
553 よって \verb/addSym/ により O と n を変換した後に cong で S を加えることで証明ができる。 | |
554 | |
555 ここで、 $ O + n \equiv n $ は + の定義により自明であるが、$ n + O \equiv n $ をそのまま導出できないことに注意して欲しい。 | |
556 + の定義は左側の項から S を右側の項への移すだけであるため、右側の項への演算はしない。 | |
557 | |
558 \item n = S n, m = S m | |
559 | |
560 3つのパターンは証明したが、このパターンは少々長くなるため別に解説することとする。 | |
561 \end{itemize} | |
562 | |
563 3 つのパターンにおいては refl や cong といった単純な項で証明を行なうことができた。 | |
564 しかし長い証明になると refl や cong といった式を trans で大量に繋げていく必要性がある。 | |
565 長い証明を分かりやすく記述するために $ \equiv $-Reasoning を用いる。 | |
566 | |
567 $ \equiv $-Reasoning では等式の左辺を begin の後に記述し、等式の変形を $ \equiv \langle expression \rangle $ に記述することで変形していく。 | |
568 最終的に等式の左辺を $ \blacksquare $ の項へと変形することで等式の証明が得られる。 | |
569 | |
570 自然数の加法の交換法則を $ \equiv $-Reasoning を用いて証明した例がリスト\ref{src:agda-reasoning}である。 | |
571 特に n と m が1以上である時の証明に注目する。 | |
572 | |
573 \lstinputlisting[label=src:agda-reasoning, caption= $ \equiv $ - Reasoning を用いた証明の例] {src/Reasoning.agda.replaced} | |
574 | |
575 まず \verb/ (S n) + (S m)/ は + の定義により \verb/ S (n + (S m)) / に等しい。 | |
576 よって refl で導かれる。 | |
577 なお、基本的に定義などで同じ項に簡約される時は refl によって記述することが多い。 | |
578 | |
579 次に \verb/S (n + (S m)) / に対して addSym を用いて交換し、 cong によって S を追加することで \verb/ S ((S m) + n) / を得る。 | |
580 これは、前3パターンにおいて + の右辺の項が 1以上であっても上手く交換法則が定義できたことを利用して項を変形している。 | |
581 このように同じ法則の中でも、違うパターンで証明できた部分を用いて別パターンの証明を行なうこともある。 | |
582 | |
583 最後に \verb/S ((S m) + n)/ から \verb/(S m) + (S n)/を得なくてはならない。 | |
584 しかし、 + の定義には右辺に対して S を移動する演算が含まれていない。 | |
585 よってこのままでは証明することができない。 | |
586 そのため、等式 $ S (m + n) \equiv m + (S n) $ を addToRight として定義する。 | |
587 addToRight の証明の解説は省略する。 | |
588 addToRight を用いることで \verb/S ((S m) + n)/ から \verb/(S m) + (S n)/を得られた。 | |
589 これで等式 $ (S m) + (S n) \equiv (S n) + (S m) $ の証明が完了した。 | |
590 | |
591 自然数に対する + の演算を考えた時にありえるコンストラクタの組み合せ4パターンのいずれかでも交換法則の等式が成り立つことが分かった。 | |
592 このように、Agda における等式の証明は、定義や等式を用いて右辺と左辺を同じ項に変形することで行なわれる。 | |
593 | |
594 % }}} |