comparison agda.tex @ 26:de3397af1f8d

Temporary save
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Tue, 10 Feb 2015 15:30:01 +0900
parents a0d91fbf4876
children e30a02baba55
comparison
equal deleted inserted replaced
25:a0d91fbf4876 26:de3397af1f8d
300 % }}} 300 % }}}
301 301
302 % {{{ Agda による証明 302 % {{{ Agda による証明
303 303
304 \section{Agda による証明} 304 \section{Agda による証明}
305 \label{section:agda}
305 \ref{section:curry_howard_isomorphism}節において型を用いて証明を行なう手法を述べた。 306 \ref{section:curry_howard_isomorphism}節において型を用いて証明を行なう手法を述べた。
306 しかし、Haskell における型システムは証明を記述するために用いるものではない。 307 しかし、Haskell における型システムは証明を記述するために用いるものではない。
307 よって、依存型を持つ証明支援言語 Agda を用いて証明を記述していく。 308 よって、依存型を持つ証明支援言語 Agda を用いて証明を記述していく。
308 309
309 依存型とは値に依存した型を作ることができる型であり、非常に表現能力が高い。 310 依存型とは値に依存した型を作ることができる型であり、非常に表現能力が高い。
358 \verb/A x B/ 型から B を取るため、\verb/A x B/ 型の変数を直接束縛せずにコンストラクタで分解し、a と b に束縛することで A と B が得られる。 359 \verb/A x B/ 型から B を取るため、\verb/A x B/ 型の変数を直接束縛せずにコンストラクタで分解し、a と b に束縛することで A と B が得られる。
359 そのため、 patternMathProduct は $ \land 2 \mathcal{E} $ そのものである。 360 そのため、 patternMathProduct は $ \land 2 \mathcal{E} $ そのものである。
360 361
361 % }}} 362 % }}}
362 363
363
364 \section{Reasoning} 364 \section{Reasoning}
365 365 \label{section:reasoning}
366 % TODO: nat かなー 366 \ref{section:agda} 節ではAgdaにおける証明の手法について解説した。
367 \ref{section:reasoning}節では Agda における証明の例として、自然数の加法の交換法則を証明する。
368
369 まずは自然数を定義する。
370 今回用いる自然数の定義は以下のようなものである。
371
372 \begin{itemize}
373 \item 0 は自然数である
374 \item 任意の自然数には後続数が存在する
375 \item 0 はいかなる自然数の後続数でもない
376 \item 異なる自然数どうしの後続数は異なる ($ n \neq m \rightarrow S n \neq S m $)
377 \item 0がある性質を満たし、aがある性質を満たせばその後続数 S(n) も自然数である
378 \end{itemize}
379
380 この定義は peano arithmetic における自然数の定義である。
381
382 Agda で自然数型 Nat を定義するとリスト \ref{src:nat} のようになる。
383
384 \begin{table}[html]
385 \lstinputlisting[label=src:nat, caption=Agda における自然数型 Nat の定義] {src/nat.agda}
386 \end{table}
387
388 自然数型 Nat は2つのコンストラクタを持つ。
389
390 \begin{itemize}
391 \item O
392
393 引数を持たないコンストラクタ。これが0に相当する。
394
395 \item S
396
397 Nat を引数に取るコンストラクタ。これが後続数に相当する。
398
399 \end{itemize}
400
401 よって、数値の 3 は \verb/S (S (S O))/ のように表現される。
402 Sの個数が数値に対応する。
403
404 次に加算を定義する(リスト\ref{src:nat_add})。
405
406 \begin{table}[html]
407 \lstinputlisting[label=src:nat_add, caption=Agdaにおける自然数型に対する加算の定義] {src/nat_add.agda}
408 \end{table}
409
410 加算は中置関数 \verb/_+_/ として定義する。
411 2つの Nat を取り、Natを返す。
412 パターンマッチにより処理を変える。
413 0に対して m 加算する場合は m であり、 n の後続数に対して m 加算する場合は n に m 加算した数の後続数とする。
414 S を左の数から右の数へ1つずつ再帰的に移していくような加算である。
415
416 例えば 3 + 1 といった計算は (S (S (S O))) + (S O) のように記述される。
417 ここで 3 + 1 が 4と等しいことの証明を行なう。
418
419 等式の証明には agda の standard library における Relation.Binary.Core の定義を用いる。
420
421 \begin{table}[html]
422 \lstinputlisting[label=src:equiv, caption= Relation.Binary.Core による等式を示す型 $ \equiv $] {src/equiv.agda}
423 \end{table}
424 等式は等式を示すデータ型 $ \equiv $ により定義される。
425 $ \equiv $ は同じ両辺が同じ項に簡約される時にコンストラクタ refl で構築できる。
426
427 実際に 3 + 1 = 4 の証明は refl で構成できる(リスト\ref{src:three_plus_one})。
428
429 \begin{table}[html]
430 \lstinputlisting[label=src:three_plus_one, caption= Agda における 3 + 1 の結果が 4 と等しい証明] {src/three_plus_one.agda}
431 \end{table}
432
433 3+1 という1つの関数を定義し、その型として証明すべき式 \verb/(S (S (S O))) + (S O)≡(S (S (S (S O))))/ を記述する。
434 そして証明を関数の定義として記述する。
435 今回は \verb/_+_/ 関数の定義により \verb/ (S (S (S (S O)))) / に簡約されるためにコンストラクタ refl が証明となる。
436
437 $ \equiv $ によって証明する際、必ず同じ式に簡約されるとは限らないため、いくつかの操作が Relation.Binary.PropositionalEquality に定義されている。
438
439 \begin{itemize}
440 \item sym : $ x \equiv y \rightarrow y \equiv x $
441
442 等式が証明できればその等式の左辺と右辺を反転しても等しい。
443
444 \item cong : $ f \rightarrow x \equiv y \rightarrow f x \equiv f y $
445
446 証明した等式に同じ関数を与えても等式は保たれる。
447
448 \item trans : $ x \equiv y \rightarrow y \equiv z \rightarrow x \equiv z $
449
450 2つの等式に表れた同じ項を用いて2つの等式を繋げた等式は等しい。
451 \end{itemize}
452
453 ではこれから nat の加法の交換法則を証明していく(リスト\ref{src:nat_add_sym})。
454
455 \begin{table}[html]
456 \lstinputlisting[label=src:nat_add_sym, caption= Agda における加法の交換法則の証明] {src/nat_add_sym.agda}
457 \end{table}
458
459 証明する式は $ n + m \equiv m + n $ である。
460 n と m は Nat であるため、それぞれがコンストラクタ O か S により構成される。
461 そのためにパターンは4通りある。
462
463 \begin{itemize}
464 \item n = O, m = O
465
466 + の定義により、 O に簡約されるため refl で証明できる。
467
468 \item n = O, m = S m
469
470 $ O + (S m) \equiv (S m) + O $ を証明することになる。
471 この等式は + の定義により $ O + (S m) \equiv S (m + O) $ と変形できる。
472 $ S (m + O) $ は $ m + O $ に S を加えたものであるため、 cong を用いて再帰的に \verb/add_sym/ を実行することで証明できる。
473
474 この2つの証明はこのような意味を持つ。
475 n が 0 であるとき、 m も 0 なら簡約により等式が成立する。
476 n が 0 であるとき、 m が 0 でないとき、 m は後続数である。
477 よって m が (S x) と書かれる時、 x は m の前の値である。
478 前の値による交換法則を用いてからその結果の後続数も + の定義により等しい。
479 ここで、 \verb/add_sym/ に渡される m は1つ値が減っているため、最終的には n = 0, m = 0 である refl にまで簡約され、等式が得られる。
480
481 \item n = S n, m = O
482
483 $ (S n) + O \equiv O + (S n) $ を証明する。
484 この等式は + の定義により $ S (n + O) \equiv (S n) $ と変形できる。
485 さらに変形すれば $ S (n + O) \equiv S (O + n) $ となる。
486 よって \verb/add_sym/ により O と n を変換した後に cong で S を加えることで証明ができる。
487
488 ここで、 $ O + n \equiv n $ は + の定義により自明であるが、$ n + O \equiv n $ をそのまま導出できないことに注意して欲しい。
489 + の定義は左側の項から S を右側の項への移すだけであるため、右側の項への演算はしない。
490
491 \item n = S n, m = S m
492
493 3つのパターンは証明したが、このパターンは少々長くなるため別に解説することとする。
494 \end{itemize}
495
496 3 つのパターンにおいては refl や cong といった単純な項で証明を行なうことができた。
497 しかし長い証明になると refl や cong といった式を trans で大量に繋げていく必要性がある。
498 長い証明を分かりやすく記述するために $ \equiv $-Reasoning を用いる。