changeset 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
files agda.tex bibliography.tex jlisting.sty main.tex src/equiv.agda src/nat.agda src/nat_add.agda src/nat_add_sym.agda src/nat_add_sym_reasoning.agda src/product.agda src/three_plus_one.agda
diffstat 11 files changed, 423 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/agda.tex	Tue Feb 10 12:48:02 2015 +0900
+++ b/agda.tex	Tue Feb 10 15:30:01 2015 +0900
@@ -302,6 +302,7 @@
 % {{{ Agda による証明
 
 \section{Agda による証明}
+\label{section:agda}
 \ref{section:curry_howard_isomorphism}節において型を用いて証明を行なう手法を述べた。
 しかし、Haskell における型システムは証明を記述するために用いるものではない。
 よって、依存型を持つ証明支援言語 Agda を用いて証明を記述していく。
@@ -360,7 +361,138 @@
 
 % }}}
 
+\section{Reasoning}
+\label{section:reasoning}
+\ref{section:agda} 節ではAgdaにおける証明の手法について解説した。
+\ref{section:reasoning}節では Agda における証明の例として、自然数の加法の交換法則を証明する。
 
-\section{Reasoning}
+まずは自然数を定義する。
+今回用いる自然数の定義は以下のようなものである。
+
+\begin{itemize}
+    \item 0 は自然数である
+    \item 任意の自然数には後続数が存在する
+    \item 0 はいかなる自然数の後続数でもない
+    \item 異なる自然数どうしの後続数は異なる ($ n \neq m \rightarrow S n \neq S m $)
+    \item 0がある性質を満たし、aがある性質を満たせばその後続数 S(n) も自然数である
+\end{itemize}
+
+この定義は peano arithmetic における自然数の定義である。
+
+Agda で自然数型 Nat を定義するとリスト \ref{src:nat} のようになる。
+
+\begin{table}[html]
+    \lstinputlisting[label=src:nat, caption=Agda における自然数型 Nat の定義] {src/nat.agda}
+\end{table}
+
+自然数型 Nat は2つのコンストラクタを持つ。
+
+\begin{itemize}
+    \item O
+
+        引数を持たないコンストラクタ。これが0に相当する。
+
+    \item S
+
+        Nat を引数に取るコンストラクタ。これが後続数に相当する。
+
+\end{itemize}
+
+よって、数値の 3 は \verb/S (S (S O))/ のように表現される。
+Sの個数が数値に対応する。
+
+次に加算を定義する(リスト\ref{src:nat_add})。
+
+\begin{table}[html]
+    \lstinputlisting[label=src:nat_add, caption=Agdaにおける自然数型に対する加算の定義] {src/nat_add.agda}
+\end{table}
+
+加算は中置関数 \verb/_+_/ として定義する。
+2つの Nat を取り、Natを返す。
+パターンマッチにより処理を変える。
+0に対して m 加算する場合は m であり、 n の後続数に対して m 加算する場合は n に m 加算した数の後続数とする。
+S を左の数から右の数へ1つずつ再帰的に移していくような加算である。
+
+例えば 3 + 1 といった計算は (S (S (S O))) + (S O) のように記述される。
+ここで 3 + 1 が 4と等しいことの証明を行なう。
+
+等式の証明には agda の standard library における Relation.Binary.Core の定義を用いる。
+
+\begin{table}[html]
+    \lstinputlisting[label=src:equiv, caption= Relation.Binary.Core による等式を示す型 $ \equiv $] {src/equiv.agda}
+\end{table}
+等式は等式を示すデータ型 $ \equiv $ により定義される。
+$ \equiv $ は同じ両辺が同じ項に簡約される時にコンストラクタ refl で構築できる。
+
+実際に 3 + 1 = 4 の証明は refl で構成できる(リスト\ref{src:three_plus_one})。
+
+\begin{table}[html]
+    \lstinputlisting[label=src:three_plus_one, caption= Agda における 3 + 1 の結果が 4 と等しい証明] {src/three_plus_one.agda}
+\end{table}
 
-% TODO: nat かなー
+3+1 という1つの関数を定義し、その型として証明すべき式 \verb/(S (S (S O))) + (S O)≡(S (S (S (S O))))/ を記述する。
+そして証明を関数の定義として記述する。
+今回は \verb/_+_/ 関数の定義により \verb/ (S (S (S (S O)))) / に簡約されるためにコンストラクタ refl が証明となる。
+
+$ \equiv $ によって証明する際、必ず同じ式に簡約されるとは限らないため、いくつかの操作が Relation.Binary.PropositionalEquality に定義されている。
+
+\begin{itemize}
+    \item sym  : $ x \equiv y \rightarrow y \equiv x $
+
+        等式が証明できればその等式の左辺と右辺を反転しても等しい。
+
+    \item cong : $ f \rightarrow x \equiv y \rightarrow f x \equiv f y $
+
+        証明した等式に同じ関数を与えても等式は保たれる。
+
+    \item trans : $ x \equiv y \rightarrow y \equiv z \rightarrow x \equiv z $
+
+        2つの等式に表れた同じ項を用いて2つの等式を繋げた等式は等しい。
+\end{itemize}
+
+ではこれから nat の加法の交換法則を証明していく(リスト\ref{src:nat_add_sym})。
+
+\begin{table}[html]
+    \lstinputlisting[label=src:nat_add_sym, caption= Agda における加法の交換法則の証明] {src/nat_add_sym.agda}
+\end{table}
+
+証明する式は $ n + m \equiv m + n $ である。
+n と m は Nat であるため、それぞれがコンストラクタ O か S により構成される。
+そのためにパターンは4通りある。
+
+\begin{itemize}
+    \item n = O, m = O
+
+        + の定義により、 O に簡約されるため refl で証明できる。
+
+    \item n = O, m = S m
+
+        $ O + (S m) \equiv (S m) + O $  を証明することになる。
+        この等式は + の定義により $ O + (S m) \equiv S (m + O) $ と変形できる。
+        $ S (m + O) $ は $ m + O $ に S を加えたものであるため、 cong を用いて再帰的に \verb/add_sym/ を実行することで証明できる。
+
+        この2つの証明はこのような意味を持つ。
+        n が 0 であるとき、 m も 0 なら簡約により等式が成立する。
+        n が 0 であるとき、 m が 0 でないとき、 m は後続数である。
+        よって m が (S x) と書かれる時、 x は m の前の値である。
+        前の値による交換法則を用いてからその結果の後続数も + の定義により等しい。
+        ここで、 \verb/add_sym/ に渡される m は1つ値が減っているため、最終的には n = 0, m = 0 である refl にまで簡約され、等式が得られる。
+
+    \item n = S n, m = O
+
+        $ (S n) + O \equiv O + (S n) $ を証明する。
+        この等式は + の定義により $ S (n + O) \equiv (S n) $ と変形できる。
+        さらに変形すれば $ S (n + O) \equiv S (O + n) $ となる。
+        よって \verb/add_sym/ により O と n を変換した後に cong で S を加えることで証明ができる。
+
+        ここで、 $ O + n  \equiv n $ は + の定義により自明であるが、$ n + O \equiv n $ をそのまま導出できないことに注意して欲しい。
+        + の定義は左側の項から S を右側の項への移すだけであるため、右側の項への演算はしない。
+
+    \item n = S n, m = S m
+
+        3つのパターンは証明したが、このパターンは少々長くなるため別に解説することとする。
+\end{itemize}
+
+3 つのパターンにおいては refl や cong といった単純な項で証明を行なうことができた。
+しかし長い証明になると refl や cong といった式を trans で大量に繋げていく必要性がある。
+長い証明を分かりやすく記述するために $ \equiv $-Reasoning を用いる。
--- a/bibliography.tex	Tue Feb 10 12:48:02 2015 +0900
+++ b/bibliography.tex	Tue Feb 10 15:30:01 2015 +0900
@@ -8,6 +8,17 @@
 %書籍、論文、URLによって若干書き方が異なる。
 %URLを載せる人は参考にした年月日を最後に記入すること。
 
+% TODO: List
+
+% books
+% proofs and types
+% Introduction to higher order categorical logic
+% category theory for the computiong science
+
+% papers
+% notion of computations and monads
+% composing monads
+
 
 \bibitem{hoge}
 hoge
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jlisting.sty	Tue Feb 10 15:30:01 2015 +0900
@@ -0,0 +1,216 @@
+\NeedsTeXFormat{LaTeX2e}
+\def\filedate{2006/02/20}
+\def\fileversion{0.2}
+\ProvidesPackage{jlisting}[\filedate\space\fileversion\space(Thor)]
+%
+\newcount\lst@nextchar
+\let\lst@@ProcessSpace\lst@ProcessSpace
+\def\lst@ProcessSpace#1{%
+   \lst@check@chartype{#1}%
+      \lst@@ProcessSpace
+      \lst@whitespacetrue}
+\let\lst@@ProcessLetter\lst@ProcessLetter
+\def\lst@ProcessLetter#1#2{%
+   \lst@check@chartype{#2}%
+      {\lst@@ProcessLetter{#1}}%
+      \relax}
+\let\lst@@ProcessDigit\lst@ProcessDigit
+\def\lst@ProcessDigit#1#2{%
+   \lst@check@chartype{#2}%
+      {\lst@@ProcessDigit{#1}}%
+      \relax}
+\let\lst@@ProcessOther\lst@ProcessOther
+\def\lst@ProcessOther#1#2{%
+   \lst@check@chartype{#2}%
+      {\lst@@ProcessOther{#1}}%
+      \relax}
+\let\lst@@ProcessTabulator\lst@ProcessTabulator
+\def\lst@ProcessTabulator#1{%
+   \lst@check@chartype{#1}%
+      \lst@@ProcessTabulator
+      \relax}
+\def\lst@check@chartype#1#2#3{%
+   \edef\@tempa{\lst@nextchar=`\string#1\relax}%
+   \afterassignment\remove@to@nnil
+   \@tempa\@nnil
+   #2%
+   \ifnum\lst@nextchar<\@cclvi
+      #3%
+   \else
+      \lst@ifletter \else \lst@OutputOther \fi
+      \lst@whitespacefalse
+      \expandafter\lst@AppendJchar
+   \fi
+   #1}
+\def\lst@AppendJchar#1#2{%
+   \lst@check@chartype{#2}%
+      {\advance\lst@length\@ne\lst@Append{#1}}%
+      \relax}
+\def\lst@check@chartype@BOL#1{%
+   \edef\@tempa{\lst@nextchar=`\string#1\relax}%
+   \afterassignment\remove@to@nnil
+   \@tempa\@nnil
+   \ifnum\lst@nextchar<\@cclvi\else
+      \lst@whitespacefalse
+      \expandafter\lst@AppendJchar
+   \fi
+   #1}
+\def\lst@InputListing#1{%
+   \begingroup
+      \lsthk@PreSet \gdef\lst@intname{#1}%
+      \expandafter\lstset\expandafter{\lst@set}%
+      \lsthk@DisplayStyle
+      \catcode\active=\active
+      \lst@Init\relax \let\lst@gobble\z@
+      \lst@SkipToFirst
+      \lst@ifprint \def\lst@next{\lst@get@filecontents{#1}}%
+      \else        \let\lst@next\@empty
+      \fi
+      \lst@next
+      \lst@DeInit
+   \endgroup}
+\newread\lst@inputfile
+\def\lst@get@filecontents#1{%
+   \let\lst@filecontents\@empty
+   \openin\lst@inputfile=#1\relax
+   \let\@lst@get@filecontents@prevline\relax
+   \lst@get@filecontents@loop
+   \closein\lst@inputfile
+   \lst@filecontents\empty}
+\def\lst@get@filecontents@loop{%
+   \read\lst@inputfile to\@lst@get@filecontents@currline
+   \ifx\@lst@get@filecontents@prevline\relax\else
+      \expandafter\expandafter\expandafter\def
+      \expandafter\expandafter\expandafter\lst@filecontents
+      \expandafter\expandafter\expandafter{%
+         \expandafter\lst@filecontents\@lst@get@filecontents@prevline}%
+   \fi
+   \let\@lst@get@filecontents@prevline\@lst@get@filecontents@currline
+   \ifeof\lst@inputfile\else
+      \expandafter\lst@get@filecontents@loop
+   \fi}
+%%% [$B$3$N=hM}$b!$AjEv6/0z$G$9!%(B]
+\def\lst@BOLGobble{%
+   \ifnum\lst@gobble>\z@
+      \@tempcnta\lst@gobble\relax
+      \expandafter\lst@BOLGobble@
+   \else
+      \expandafter\lst@check@chartype@BOL
+   \fi}
+\def\lst@BOLGobble@#1{%
+   \let\lst@next#1%
+   \ifx \lst@next\relax\else
+   \ifx \lst@next\lst@MProcessListing\else
+   \ifx \lst@next\lst@ProcessFormFeed\else
+   \ifx \lst@next\lstenv@backslash
+      \let\lst@next\lstenv@BOLGobble@@
+   \else
+      \let\lst@next\lst@BOLGobble@@
+      \ifx #1\lst@ProcessTabulator
+         \advance\@tempcnta-\lst@tabsize\relax
+         \ifnum\@tempcnta<\z@
+            \lst@length-\@tempcnta \lst@PreGotoTabStop
+         \fi
+      \else
+         \edef\@tempa{\lst@nextchar=`\string#1\relax}%
+         \@tempa
+         \ifnum\lst@nextchar<\@cclvi\else
+            \advance\@tempcnta\m@ne
+         \fi
+         \advance\@tempcnta\m@ne
+      \fi
+   \fi \fi \fi \fi
+   \lst@next}
+\def\lst@BOLGobble@@{%
+   \ifnum\@tempcnta>\z@
+      \expandafter\lst@BOLGobble@
+   \else
+      \expandafter\lst@check@chartype@BOL
+   \fi
+}
+%
+%    \begin{$B=$@5;v9`(B}{1.3}
+% $B$A$g$C$H$7$?=$@5(B
+\gdef\lst@breakProcessOther#1{\lst@ProcessOther#1}
+% $B%=!<%9%3!<%IL\<!$K$*$1$kJ8;z$HHV9f$N6u$-(B
+\let \l@lstlisting = \l@figure
+% $B%-%c%W%7%g%s$H%=!<%9%3!<%IL\<!$KBP$9$kF|K\8lBP1~(B
+\def\lstlistingname{$B%=!<%9%3!<%I(B}
+\def\lstlistlistingname{$B%=!<%9%3!<%IL\<!(B}
+%    \end{$B=$@5;v9`(B}
+\endinput
+% 
+%#!platex
+\documentclass[papersize]{jsarticle}
+% Macros
+\IfFileExists{dvipdfmx.def}{%
+  \usepackage[dvipdfmx]{color,graphicx}%
+}{%
+  \usepackage[dvipdfm]{color,graphicx}%
+}
+\usepackage{listings}[2004/09/07]
+\usepackage{jlisting}[2006/02/20]
+\usepackage{url} 
+\usepackage{verbatim}
+
+\makeatletter
+% Original Macros
+\def\email#1{\gdef\@email{\texttt{#1}}}
+\def\homepage#1{\gdef\@homepage{\texttt{#1}}}
+\def\mac#1{\textsf{#1}}
+\def\URL#1{\texttt{#1}}
+\def\src#1{\texttt{#1}}
+
+% Dvipdfmx.def 
+\def\dvipdfmxDefi{http://tex.dante.jp/ok/dvipdfmx/}
+\def\dvipdfmxDefii{http://ftp.ktug.or.kr/KTUG/dvipdfmx/contrib/latex/}
+
+\IfFileExists{dvipdfmx.def}{%
+   \let \IfDvipdfmxDef = \empty \relax}{%
+   \typeout{^^Jget dvipdfmx.def at \dvipdfmxDefi^^J
+            or \dvipdfmxDefii^^J}%
+   \def\IfDvipdfmxDef{Get \src{dvipdfmx.def} at \URL \dvipdfmxDefii \\ 
+      or \URL \dvipdfmxDefi.}%
+}
+
+% Author Info
+\author   {Th\'or Watanabe\thanks \@email \space \thanks \@homepage}
+\title    {\mac{jlisting.sty}\\
+          ---Japanese Localized Patch File of \mac{listings}---}
+\email    {thor@tex.dante.jp}
+\homepage {http://tex.dante.jp/typo/}
+\date     {2006/02/20}
+
+\makeatother
+
+\begin{document}
+\maketitle
+%\IfDvipdfmxDef
+
+\section{$B$A$g$C$H$7$?@bL@(B}% Short Description
+ 
+$B1|B<@2I';a$N7G<(HD$N!VHFMQE*$JIbF0BN!W$H$$$&0lO"$N=q$-9~$_$+$i(B
+$BE>:\$7$^$7$?!#(B
+
+\begin{quote}
+ \url{http://http://cise.edu.mie-u.ac.jp/~okumura/texfaq/qa/21172.html}\\
+ \url{http://http://cise.edu.mie-u.ac.jp/~okumura/texfaq/qa/21184.html}\\
+ \url{http://http://cise.edu.mie-u.ac.jp/~okumura/texfaq/qa/21189.html}\\
+ \url{http://http://cise.edu.mie-u.ac.jp/~okumura/texfaq/qa/21197.html}
+\end{quote}
+
+ Copyright $B$O5H1JE/H~;a$K$"$k$N$@$H;W$$$^$9!%(B
+ 
+\section{$B99?7MzNr(B}% ChageLogs
+
+\begin{description}
+ \item[ver.~0.1 (2004/03/24)]
+   $B$H$j$"$($:8x3+!%(B
+ \item[ver.~0.2 (2006/02/20)] 
+   \verb|\lst@breakProcessOther| $BL?Na$NDj5A$NDI2C!%(B
+\end{description}
+
+\section{$B%=!<%9%3!<%I(B}
+\par\narrowbaselines
+\verbatiminput{jlisting.sty}
+\end{document}
--- a/main.tex	Tue Feb 10 12:48:02 2015 +0900
+++ b/main.tex	Tue Feb 10 15:30:01 2015 +0900
@@ -3,7 +3,7 @@
 \usepackage{mythesis}
 \usepackage{multirow}
 \usepackage{here}
-\usepackage{listings}
+\usepackage{listings, jlisting}
 \usepackage{bussproofs}
 
 \setlength{\itemsep}{-1zh}
@@ -30,6 +30,7 @@
 
 \lstset{
   frame=single,
+  keepspaces=true,
   stringstyle={\ttfamily},
   commentstyle={\ttfamily},
   identifierstyle={\ttfamily},
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/equiv.agda	Tue Feb 10 15:30:01 2015 +0900
@@ -0,0 +1,1 @@
+data _≡_ {a} {A : Set a} (x : A) : A → Set a where
  refl : x ≡ x
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nat.agda	Tue Feb 10 15:30:01 2015 +0900
@@ -0,0 +1,5 @@
+module nat where
+  
+data Nat : Set where
+  O : Nat
+  S : Nat -> Nat
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nat_add.agda	Tue Feb 10 15:30:01 2015 +0900
@@ -0,0 +1,6 @@
+open import nat
+module nat_add where
+ 
+_+_ : Nat -> Nat -> Nat
+O + m     = m
+(S n) + m = S (n + m)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nat_add_sym.agda	Tue Feb 10 15:30:01 2015 +0900
@@ -0,0 +1,14 @@
+open import Relation.Binary.PropositionalEquality
+open import nat
+open import nat_add
+open ≡-Reasoning
+
+module nat_add_sym where
+
+add_sym : (n m : Nat) -> n + m ≡ m + n
+add_sym O       O   = refl
+add_sym O    (S m)  = cong S (add_sym O m)
+add_sym (S n)   O   = cong S (add_sym n O)
+add_sym (S n) (S m) = {!!}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nat_add_sym_reasoning.agda	Tue Feb 10 15:30:01 2015 +0900
@@ -0,0 +1,22 @@
+open import Relation.Binary.PropositionalEquality
+open import nat
+open import nat_add
+open ≡-Reasoning
+
+module nat_add_sym_reasoning where
+
+add_to_right : (n m : Nat) -> S (n + m) ≡ n + (S m)
+add_to_right n m = {!!}
+
+addSym : (n m : Nat) -> n + m ≡ m + n
+addSym O       O   = refl
+addSym O    (S m)  = cong S (add_sym O m)
+addSym (S n)   O   = cong S (add_sym n O)
+add_sym (S n) (S m) = begin
+  S (n + S m)    ≡⟨ cong S (add_sym n (S m)) ⟩
+  S (S (m + n))  ≡⟨ refl ⟩
+  S ((S m) + n)  ≡⟨ {!!} ⟩
+  S (m + S n) 
+  ∎
+
+
--- a/src/product.agda	Tue Feb 10 12:48:02 2015 +0900
+++ b/src/product.agda	Tue Feb 10 15:30:01 2015 +0900
@@ -1,10 +1,10 @@
 module product where
 
-data _x_ (A B : Set) : Set where
-  <_,_> : A -> B -> A x B
+data _×_ (A B : Set) : Set where
+  <_,_> : A -> B -> A × B
 
-constructProduct : {A B : Set} -> A -> B -> A x B
+constructProduct : {A B : Set} -> A -> B -> A × B
 constructProduct a b = < a , b >
 
-patternMatchProduct : {A B : Set} -> A x B -> B
+patternMatchProduct : {A B : Set} -> A × B -> B
 patternMatchProduct (< a , b >) = b
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/three_plus_one.agda	Tue Feb 10 15:30:01 2015 +0900
@@ -0,0 +1,8 @@
+open import Relation.Binary.PropositionalEquality
+open import nat
+open import nat_add
+
+module three_plus_one where
+
+3+1 : (S (S (S O)))  +  (S O) ≡ (S (S (S (S O))))
+3+1 = refl
\ No newline at end of file