Mercurial > hg > Papers > 2015 > atton-thesis
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 を用いる。 |