annotate Paper/tecrep.tex @ 17:61117df82f51 default tip

fix
author ryokka
date Wed, 16 Jan 2019 12:42:49 +0900
parents 08f8641c705b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
1 %% v3.1 [2018/04/18]
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
2 %\documentclass[Proof,technicalreport]{ieicej}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
3 \documentclass[technicalreport]{ieicej}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
4
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
5 \usepackage[dvipdfmx]{graphicx}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
6 \usepackage{graphicx}
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
7 \usepackage{lmodern}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
8 \usepackage{textcomp}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
9 \usepackage{latexsym}
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
10 \usepackage{ascmac}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
11 \usepackage[fleqn]{amsmath}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
12 \usepackage{amssymb}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
13 \usepackage[deluxe, multi]{otf}
4
ryokka
parents: 2
diff changeset
14 \usepackage{url}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
15 \usepackage{cite}
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
16 \usepackage[portuguese]{babel}
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
17 \usepackage[utf8]{inputenc}
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
18 \usepackage{listingsutf8}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
19 \usepackage{listings}
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
20 \usepackage{colonequals}
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
21 \usepackage{inconsolata}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
22 \lstset{
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
23 frame=single,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
24 keepspaces=true,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
25 stringstyle={\ttfamily},
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
26 commentstyle={\ttfamily},
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
27 identifierstyle={\ttfamily},
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
28 keywordstyle={\ttfamily},
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
29 % basicstyle=\footnotesize,
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
30 breaklines=true,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
31 xleftmargin=0zw,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
32 xrightmargin=0zw,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
33 framerule=.2pt,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
34 columns=[l]{fullflexible},
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
35 numbers=left,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
36 stepnumber=1,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
37 numberstyle={\scriptsize},
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
38 numbersep=1em,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
39 language={},
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
40 tabsize=4,
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
41 lineskip=-0.5zw,
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
42 inputencoding=utf8,
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
43 extendedchars=true,
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
44 stringstyle={\ttfamily},
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
45 escapechar={@},
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
46 %% mathescape=true,
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
47 }
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
48
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
49 %% literate=
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
50 %% {⟨}{{\langle}}1
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
51 %% {⟩}{{\rangle}}1
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
52 %% {ℕ}{{$\mathbb{N}$}}1
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
53 %% {^^e2^^84^^95}{{$\mathbb{N}$}}1
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
54
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
55 % basicstyle={\ttfamily},
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
56 \renewcommand{\lstlistingname}{Code}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
57 \usepackage{caption}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
58 \captionsetup[lstlisting]{font={small,tt}}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
59
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
60 \def\IEICEJcls{\texttt{ieicej.cls}}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
61 \def\IEICEJver{3.1}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
62 \newcommand{\AmSLaTeX}{%
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
63 $\mathcal A$\lower.4ex\hbox{$\!\mathcal M\!$}$\mathcal S$-\LaTeX}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
64 %\newcommand{\PS}{{\scshape Post\-Script}}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
65 \def\BibTeX{{\rmfamily B\kern-.05em{\scshape i\kern-.025em b}\kern-.08em
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
66 T\kern-.1667em\lower.7ex\hbox{E}\kern-.125em X}}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
67
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
68 \jtitle{GearsOSのHoare Logicをベースにした検証手法}
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
69 %% \jsubtitle{技術研究報告原稿のための解説とテンプレート}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
70 %% \etitle{How to Use \LaTeXe\ Class File (\IEICEJcls\ version \IEICEJver)
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
71 %% for the Technical Report of the Institute of Electronics, Information
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
72 %% and Communication Engineers}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
73 %% \esubtitle{Guide to the Technical Report and Template}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
74 \authorlist{
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
75 \authorentry[masataka@cr.ie.u-ryukyu.ac.jp]{外間 政尊}{Masataka Hokama}{1}%
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
76 \authorentry[kono@cr.ie.u-ryukyu.ac.jp]{河野 真治}{Shinji Kono}{2}%
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
77 }
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
78 \affiliate[1]{琉球大学大学院理工学研究科情報工学専攻}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
79 {Interdisciplinary Information Engineering, Graduate School of Engineering and Science, University of the Ryukyus.}
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
80 \affiliate[2]{琉球大学工学部情報工学科}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
81 {Information Engineering, University of the Ryukyus.}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
82 %\MailAddress{$\dagger$hanako@denshi.ac.jp,
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
83 % $\dagger\dagger$\{taro,jiro\}@jouhou.co.jp}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
84 \begin{document}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
85 \begin{jabstract}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
86 あらまし
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
87 \end{jabstract}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
88 \begin{jkeyword}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
89 プログラミング言語,
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
90 CbC, Gears OS, Agda, 検証
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
91 %% あと他…?
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
92 \end{jkeyword}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
93 %% \begin{eabstract}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
94 %% %% メールを見た感じ日本語のみとなっていたので不必要…?
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
95 %% \end{eabstract}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
96 %% \begin{ekeyword}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
97 %% %% 不必要?
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
98 %% \end{ekeyword}
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
99 \maketitle
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
100 \section{まえがき}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
101 OS やアプリケーションの信頼性は重要である。
9
ryokka
parents: 8
diff changeset
102 信頼性を上げるにはプログラムが仕様を満たしていることを検証する必要がある。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
103 プログラムの検証手法として、Floyd–Hoare logic (以下 Hoare Logic)が存在している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
104 HoareLogic は事前条件が成り立っているときにある
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
105 関数を実行して、それが停止する際に事後条件を満た
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
106 すことを確認することで、検証を行う。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
107 HoareLogic はシンプルなアプローチだが通常のプログラミング言語で使用することができず、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
108 広まっているとはいえない。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
109
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
110 当研究室では信頼性の高い OS として GearsOS を開発している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
111 現在 GearsOS ではCodeGear、DataGearという単位を用いてプログラムを記述する手法を用いており、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
112 仕様の確認には定理証明系である Agda を用いている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
113
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
114 CodeGearは Agda 上では継続渡しの記述を用いた関数として
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
115 記述する。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
116 また、継続にある関数を実行するための事前条件や
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
117 事後条件などをもたせることが可能である。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
118
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
119 そのため Hoare Logic と CodeGear、DataGear という単位を用いたプログラミング手法
9
ryokka
parents: 8
diff changeset
120 記述とは相性が良く、既存の言語とは異なり HoareLogic を使ったプログラミングが容易に行えると考えている。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
121
9
ryokka
parents: 8
diff changeset
122 本研究では Agda 上での HoareLogic の記述を使い、簡単な while Loop のプログラムの作成、証明を行った。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
123 また、GearsOS の仕様確認のために CodeGear、DataGear という単位を用いた記述で Hoare Logic をベースと
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
124 したwhile Loop プログラムを記述、その証明を行なった。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
125
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
126 \section{現状}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
127 現在の OS やアプリケーションの検証では、実装と別に検証用の言語で記述された実装と証明を持つのが一般的である。
9
ryokka
parents: 8
diff changeset
128 kernel 検証\cite{Klein:2010:SFV:1743546.1743574},\cite{Nelson:2017:HPV:3132747.3132748}の例では C で記述された Kernel に対して、検証用の別の言語で書かれた等価な kernel を用いて OS の検証を行っている。
ryokka
parents: 8
diff changeset
129 また、別のアプローチとしては ATS2\cite{ats2} や Rust\cite{rust} などの低レベル記述向けの関数型言語を実装に用いる手法が存在している。
ryokka
parents: 8
diff changeset
130
ryokka
parents: 8
diff changeset
131 証明支援向けのプログラミング言語としては Agda\cite{agda}、 Coq\cite{coq} などが存在しているが、これらの言語自体は実行速度が期待できるものではない。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
132
9
ryokka
parents: 8
diff changeset
133 そこで、当研究室では検証と実装が同一の言語で行う Continuation based C\cite{cbc} という言語を開発している。
ryokka
parents: 8
diff changeset
134 Continuation based C(CbC) では、処理の単位を CodeGear、 データの単位を DataGear としている。
ryokka
parents: 8
diff changeset
135 CodeGear は値を入力として受け取り出力を行う処理の単位であり、 CodeGear の出力を 次の GodeGear に接続してプログラミングを行う。 CodeGear の接続処理はメタ計算として定義されており、実装や環境によって切り替えを行うことができる。
ryokka
parents: 8
diff changeset
136 このメタ計算部分で assertion などの検証を行うことで、 CodeGear の処理に手を加えることなく検証を行う。
ryokka
parents: 8
diff changeset
137 現段階では CbC 自体に証明を行うためのシステムが存在しないため、証明支援系言語である Agda を用いて等価な実装の検証を行っている。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
138
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
139 \section{Agda}
9
ryokka
parents: 8
diff changeset
140 Adga \cite{agda} とは証明支援系の関数型言語である。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
141 Agdaにおける型指定は : を用いて行う。例えば、 変数 x が型 A を持つ、ということを表すには x : A と記述する。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
142 データ型は、代数的なデータ構造で、その定義には data キーワードを用いる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
143 data キーワードの後に data の名前と、型、 where 句を書きインデントを深 くした後、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
144 値にコンストラクタとその型を列挙する。 Code \ref{agda-data} はこの data 型の例である。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
145 Comm では Skip、Abort、PComm などのコンストラクタを持ち、: の後に型が書かれている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
146
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
147 \begin{lstlisting}[caption=data の例,label=agda-data]
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
148 data Comm : Set where
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
149 Skip : Comm
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
150 Abort : Comm
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
151 PComm : PrimComm -> Comm
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
152 Seq : Comm -> Comm -> Comm
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
153 If : Cond -> Comm -> Comm -> Comm
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
154 While : Cond -> Comm -> Comm
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
155 \end{lstlisting}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
156
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
157 Agda には C における構造体に相当するレコード型というデータも存在する、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
158 record キーワード後の内部に field キーワードを記述し、その下に Name = value の形で値を列挙していく。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
159 複数の値を列挙する際は ; で区切る必要がある。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
160 Code \ref{agda-record} はレコード型の例であり、Env では varn と vari の二つの field を持ち、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
161 それぞれの型が Agda 上で自然数を表す Nat になっている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
162
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
163 \lstinputlisting[caption=record の例,label=agda-record]{src/record.agda.replaced}
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
164 %% \begin{lstlisting}[caption=record の例,label=agda-record]
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
165 %% record Env : Set where
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
166 %% field
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
167 %% varn : ℕ
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
168 %% vari : ℕ
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
169 %% \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
170
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
171 関数の定義は、関数名と型を記述した後に関数の本体を = の後に記述する。関数の型には → 、または$->$ を用いる。
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
172 例えば引数が型 A で返り値が型 B の関数は A $->$ B のように書ける。また、複数の引数を取る関数の型は A $->$ A $->$ B のように書ける。この時の型は A $->$ (A $->$ B) のように考えられる。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
173 ここでは Code \ref{agda-function}を例にとる。これは引き算の演算子で、Agda の Nat を二つ引数に受けて Nat を返す
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
174 関数である。 
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
175
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
176 \lstinputlisting[caption=関数の例,label=agda-function]{src/function.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
177 %% \begin{lstlisting}[caption=関数の例,label=agda-function]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
178 %% _-_ : ℕ →ℕ →ℕ
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
179 %% x - zero = x
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
180 %% zero - _ = zero
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
181 %% (suc x) - (suc y) = x - y
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
182 %% \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
183
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
184 Agda での証明では型部分に証明すべき論理式、 $\lambda$ 項部分にそれを満たす証明を書くことで証明が完成する。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
185 証明の例として Code \ref{proof} を見る。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
186 ここでの $+zero$ は右から zero を足しても $\equiv$ の両辺は等しいことを証明している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
187 これは、引数として受けている y が Nat なので、 zero の時と suc y の二つの場合を証明する必要がある。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
188
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
189 $y = zero$ の時は両辺が zero とできて、左右の項が等しいということを表す refl で証明することができる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
190 $y = suc y$ の時は x == y の時 fx == fy が成り立つという cong を使って、y の値を 1 減らしたのちに再帰的に $+zero y$
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
191 を用いて証明している。
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
192 \lstinputlisting[caption=等式変形の例,label=proof]{src/zero.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
193 %% \begin{lstlisting}[caption=等式変形の例,label=proof]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
194 %% +zero : { y : ℕ } → y + zero ≡ y
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
195 %% +zero {zero} = refl
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
196 %% +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} )
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
197 %% \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
198
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
199 また、他にも $\lambda$ 項部分で等式を変形する構文が存在している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
200 Code \ref{agda-term-pre}、 \ref{agda-term-post} は等式変形の例である。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
201 始めに等式変形を始めたいところで $let open \equiv-Reasoning in begin$と記述する。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
202 Agda 上では分からないところを ? と置いておくことができるので、残りを ? としておく。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
203 $--$ は Agda 上ではコメントである。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
204
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
205 \lstinputlisting[caption=等式変形の例1/2,label=agda-term-pre]{src/term1.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
206 %% \begin{lstlisting}[caption=等式変形の例1/3,label=agda-term-pre]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
207 %% stmt2Cond : {c10 : ℕ} → Cond
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
208 %% stmt2Cond {c10} env = (Equal (varn env) c10) ∧ (Equal (vari env) 0)
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
209
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
210 %% lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c\
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
211 %% 10})
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
212 %% lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
213 %% begin
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
214 %% ? -- ?0
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
215 %% ≡⟨ ? ⟩ -- ?1
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
216 %% ? -- ?2
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
217 %% ∎ )
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
218
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
219 %% -- ?0 : Bool
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
220 %% -- ?1 : stmt2Cond (record { varn = varn env ; vari = 0 }) ≡ true
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
221 %% -- ?2 : Bool
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
222 %% \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
223
9
ryokka
parents: 8
diff changeset
224 この状態で実行すると ? 部分に入る型を Agda が示してくれる。
ryokka
parents: 8
diff changeset
225 始めに変形する等式を ?0 に記述し、?1 の中に $x == y$ のような変形規則を入れることで等式を変形して証明することができる。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
226
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
227 ここでは \ref{agda-term-mid} の Bool 値 x を受け取って $x \wedge true$ の時必ず x であるという証明 $\wedge$true と 値と Env を受け取って Bool 値を返す stmt1Cond を使って等式変形を行う。
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
228 \lstinputlisting[caption=使っている等式変形規則,label=agda-term-mid]{src/term2.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
229 %% \begin{lstlisting}[caption=等式変形の例2/3,label=agda-term-mid]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
230 %% ∧true : { x : Bool } → x ∧ true ≡ x
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
231 %% ∧true {x} with x
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
232 %% ∧true {x} | false = refl
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
233 %% ∧true {x} | true = refl
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
234
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
235 %% stmt1Cond : {c10 : ℕ} → Cond
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
236 %% stmt1Cond {c10} env = Equal (varn env) c10
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
237 %% \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
238
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
239 最終的な証明は\ref{agda-term-post} のようになる。
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
240 \lstinputlisting[caption=等式変形の例2/2,label=agda-term-post]{src/term3.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
241 %% \begin{lstlisting}[caption=等式変形の例2/2,label=agda-term-post]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
242 %% lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c\
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
243 %% 10})
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
244 %% lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
245 %% begin
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
246 %% (Equal (varn env) c10 ) ∧ true
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
247 %% ≡⟨ ∧true ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
248 %% Equal (varn env) c10
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
249 %% ≡⟨ cond ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
250 %% true
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
251 %% ∎ )
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
252 %% \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
253
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
254
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
255 \section{GearsOS}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
256 Gears OS は信頼性をノーマルレベルの計算に対して保証し、拡張性をメタレベルの計算で実現することを目標に開発している OSである。
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
257
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
258 Gears OS は処理の単位を Code Gear、データの単位を Data Gear と呼ばれる単位でプログラムを構成する。
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
259 信頼性や拡張性はメタ計算として、通常の計算とは区別して記述する。
9
ryokka
parents: 8
diff changeset
260 Gears OS は Code Gear、Data Gear を用いたプログラミング言語である CbC(Continuation based C) で実装される。
ryokka
parents: 8
diff changeset
261 そのため、Gears OS の実装は Gears を用いたプログラミングスタイルの指標となる。
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
262
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
263 \section{CodeGearとDataGear}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
264 Gears OS ではプログラムとデータの単位として CodeGear、 DataGear を用いる。 Gear
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
265 は並列実行の単位、データ分割、 Gear 間の接続等になる。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
266 CodeGear はプログラムの処理そのもので、図 Code \ref{fig:cgdg}で示しているように任意の数の
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
267 Input DataGear を参照し、処理が完了すると任意の数の Output DataGear に書き込む。
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
268
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
269 CodeGear 間の移動は継続を用いて行われる。継続は関数呼び出しとは異なり、呼び出し
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
270 た後に元のコードに戻らず、次の CodeGear へ継続を行う。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
271 これは、関数型プログラミングでは末尾関数呼び出しを行うことに相当する。
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
272
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
273 \begin{figure}[htpb]
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
274 \begin{center}
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
275 \scalebox{0.425}{\includegraphics{pic/meta_cg_dg.pdf}}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
276 \end{center}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
277 \caption{CodeGear と DataGear の関係}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
278 \label{fig:cgdg}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
279 \end{figure}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
280
9
ryokka
parents: 8
diff changeset
281 CodeGear の接続処理はメタ計算として定義されており、実装や環境によって切り替えを行うことができる。
ryokka
parents: 8
diff changeset
282 このメタ計算部分で assertion などの検証を行うことで、 CodeGear の処理に手を加えることなく検証を行う。
4
ryokka
parents: 2
diff changeset
283
9
ryokka
parents: 8
diff changeset
284 \section{Gears と Agda}
4
ryokka
parents: 2
diff changeset
285 %% CbC の CodeGear, DataGear を用いたプログラミングスタイルと Agda での対応
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
286 ここでは Gears を用いたプログラムを検証するため、
9
ryokka
parents: 8
diff changeset
287 Agda 上での CodeGear、 DataGear との対応をみていく。
4
ryokka
parents: 2
diff changeset
288
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
289 CodeGear は Agda では継続渡しで書かれた関数と等価である。
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
290 継続は不定の型 (\verb+t+) を返す関数で表される。
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
291 CodeGear 自体も同じ型 \verb+t+ を返す関数となる。
9
ryokka
parents: 8
diff changeset
292 このとき、継続に渡される引数や、関数から出力される値が DataGear と等価になる。
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
293 Code \ref{agda-cg}は Agda で書いた CodeGear の型の例である。
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
294
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
295 \lstinputlisting[caption= whileTest の型,label=agda-cg]{src/while-test.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
296 %% \begin{lstlisting}[caption= whileTest の型,label=agda-cg]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
297 %% whileTest : {l : Level} {t : Set l} -> (c10 : ℕ) → (Code : Env -> t) -> t
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
298 %% whileTest c10 next = next (record {varn = c10 ; vari = 0} )
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
299 %% \end{lstlisting}
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
300
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
301
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
302 GearsOS で CodeGear の性質を証明するには、 Agda で記述された CodeGear と
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
303 DataGear に対して証明を行う。証明すべき性質は、不定の型を持つ継続
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
304 \verb+t+ に記述することができる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
305 例えば、 Code \ref{gears-proof} では $(vari e) ≡ 10 $ が証明したい命題で、whileTest
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
306 から、whileLoop の CodeGear に継続した後、この命題が正しければよい。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
307 この証明は proof1 の型に対応する$\lambda$項を与えると証明が完了したことになる。
9
ryokka
parents: 8
diff changeset
308 ここで与えている refl は左右の項が等しいというもので、ここでの命題が正しいことが証明できている。
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
309
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
310 % \begin{verbatim}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
311 \begin{lstlisting}[caption=Agda での証明の例,label=gears-proof]
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
312 proof1 : whileTest 10 (λ env → whileLoop env (λ e → (vari e) ≡ 10 ))
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
313 proof1 = refl
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
314 \end{lstlisting}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
315 % \end{verbatim}
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
316
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
317 %% \section{HoareLogic}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
318 %% %% HoareLogic の説明と Commands、 Rules の説明。公理としてのものなのですべて説明。
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
319
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
320 %% HoareLogic とは C.A.R Hoare、 R.W Floyd らによるプログラムの検証のアイディアである。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
321 %% これはプログラムの部分的な正当性を検証するアイディアで、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
322 %% 事前条件(Pre-Condition) P が成り立つとき、コマンド C を実行した後に
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
323 %% 事後条件(Post-Condition) Q が成り立つ。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
324 %% これを ${P} C {Q}$ のように表し、コマンドをつなげてプログラム全体を記述することで、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
325 %% プログラム内のすべての部分について検証を行うことができる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
326 %% %% これは、プログラムを Skip、 Abort、 Seq、 PComm、 If、 While の6つの規則で記述することで
4
ryokka
parents: 2
diff changeset
327
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
328 %% HoareLogic ではプログラムを Assign、 Sequential Composition、 If、 While というコマンドで
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
329 %% 記述する。
4
ryokka
parents: 2
diff changeset
330
ryokka
parents: 2
diff changeset
331 %% Skip は動作をしないコマンドで事前条件や事後条件に変化を与えない。
ryokka
parents: 2
diff changeset
332 %% About は途中で処理を中断するコマンドで Skip と同様、条件に変化を与えることはない。
ryokka
parents: 2
diff changeset
333 %% Assign は変数に値を代入するコマンドで、事前条件では代入する前の変数が存在することと
ryokka
parents: 2
diff changeset
334 %% 事後条件ではその変数に値が代入されていることになる。
ryokka
parents: 2
diff changeset
335 %% Sequential
1
df1552e4ac7a add mindmap, some figs
ryokka
parents: 0
diff changeset
336
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
337
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
338 \section{AgdaでのHoareLogic}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
339
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
340 % Agda 上での HoareLogic についての記述と検証を行う。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
341
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
342 今回は、 Code \ref{agda-while} のような while Loop に対しての検証を行う。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
343
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
344 \begin{lstlisting}[caption=while Loop Program,label=agda-while]
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
345 n = 10;
81e2a6af901e add section
ryokka
parents: 1
diff changeset
346 i = 0;
81e2a6af901e add section
ryokka
parents: 1
diff changeset
347
81e2a6af901e add section
ryokka
parents: 1
diff changeset
348 while (n>0)
81e2a6af901e add section
ryokka
parents: 1
diff changeset
349 {
81e2a6af901e add section
ryokka
parents: 1
diff changeset
350 i++;
81e2a6af901e add section
ryokka
parents: 1
diff changeset
351 n--;
81e2a6af901e add section
ryokka
parents: 1
diff changeset
352 }
81e2a6af901e add section
ryokka
parents: 1
diff changeset
353 \end{lstlisting}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
354
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
355 Code \ref{agda-while}では最初期の事前条件は何もなく、プログラムが停止するときの条件として、 $i==10 ∧ n == 0$ が成り立つ。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
356 また、 $n = 10$、 $i = 0$、 といった代入に事前条件と、事後条件をつけ、 while 文にループの普遍条件をつけることになる。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
357
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
358 現在 Agda 上での HoareLogic は初期の Agda で実装されたもの \cite{agda-alpa}とそれを現在のAgdaに対応させたもの \cite{agda2-hoare}が存在している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
359
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
360 今回は現在のAgdaに対応させたもの \cite{agda2-hoare}の Command と証明のためのルールを使って HoareLogic を実装した。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
361 Code \ref{agda-hoare} は Agda上での HoareLogic の構築子である。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
362 ここでの Comm は Agda2 に対応した Command の定義をそのまま使っている。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
363
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
364 % Code \ref{agda-alfa} \cite{agda2-hoare}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
365 $Env$ は Code \ref{agda-while}の n、 i といった変数をまとめたものであり、型として Agda 上での自然数の型である Nat を持つ。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
366
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
367 PrimComm は Primitive Command で、 n、i といった変数に 代入するときに使用される関数である。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
368
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
369 Cond は HoareLogic の Condition で、 Env を受け取って Bool 値を返す関数となっている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
370
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
371
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
372 Agda のデータで定義されている Comm は HoareLogic での Command を表す。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
373
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
374 Skip は何も変更しない Command で、 Abort はプログラムを中断する Command である。
81e2a6af901e add section
ryokka
parents: 1
diff changeset
375
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
376 PComm は PrimComm を受けて Command を返す型で定義されており、 変数を代入するときに使われる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
377
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
378 Seq は Sequence で Command を2つ受けて Command を返す型で定義されている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
379 これは、ある Command から Command に移り、その結果を次の Command に渡す型になっている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
380
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
381 If は Cond と Comm を2つ受け取り、 Cond が true か false かで 実行する Comm を変える Command である。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
382
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
383 While は Cond と Comm を受け取り、 Cond の中身が True である間、 Comm を繰り返す Command である。
81e2a6af901e add section
ryokka
parents: 1
diff changeset
384
81e2a6af901e add section
ryokka
parents: 1
diff changeset
385 \begin{lstlisting}[caption=Agda での HoareLogic の構成,label=agda-hoare]
81e2a6af901e add section
ryokka
parents: 1
diff changeset
386 PrimComm : Set
81e2a6af901e add section
ryokka
parents: 1
diff changeset
387 PrimComm = Env → Env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
388
81e2a6af901e add section
ryokka
parents: 1
diff changeset
389 Cond : Set
81e2a6af901e add section
ryokka
parents: 1
diff changeset
390 Cond = (Env → Bool)
81e2a6af901e add section
ryokka
parents: 1
diff changeset
391
81e2a6af901e add section
ryokka
parents: 1
diff changeset
392 data Comm : Set where
81e2a6af901e add section
ryokka
parents: 1
diff changeset
393 Skip : Comm
81e2a6af901e add section
ryokka
parents: 1
diff changeset
394 Abort : Comm
81e2a6af901e add section
ryokka
parents: 1
diff changeset
395 PComm : PrimComm -> Comm
81e2a6af901e add section
ryokka
parents: 1
diff changeset
396 Seq : Comm -> Comm -> Comm
81e2a6af901e add section
ryokka
parents: 1
diff changeset
397 If : Cond -> Comm -> Comm -> Comm
81e2a6af901e add section
ryokka
parents: 1
diff changeset
398 While : Cond -> Comm -> Comm
81e2a6af901e add section
ryokka
parents: 1
diff changeset
399 \end{lstlisting}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
400
81e2a6af901e add section
ryokka
parents: 1
diff changeset
401 Agda 上の HoareLogic で使われるプログラムは Comm 型の関数となる。
81e2a6af901e add section
ryokka
parents: 1
diff changeset
402 プログラムの処理を Seq でつないでいき、最終的な状態にたどり着くと値を返して止まる。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
403 %% Code \ref{agda-hoare-simpl} は 変数 $i$、 $n$ に代入を行うプログラムである。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
404 %% これは Seq で PComm を2つ繋げた形になる。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
405 Code \ref{agda-hoare-prog}は Code \ref{agda-while}で書いた While Loop を HoareLogic での Comm で記述したものである。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
406 ここでの $\$$は $()$の対応を合わせる Agda の糖衣構文で、行頭から行末までを $()$で囲っていることと同義である。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
407
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
408 \begin{lstlisting}[caption= HoareLogic のプログラム ,label=agda-hoare-prog,mathescape=false]
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
409 program : Comm
81e2a6af901e add section
ryokka
parents: 1
diff changeset
410 program =
81e2a6af901e add section
ryokka
parents: 1
diff changeset
411 Seq ( PComm (λ env → record env {varn = 10}))
81e2a6af901e add section
ryokka
parents: 1
diff changeset
412 $ Seq ( PComm (λ env → record env {vari = 0}))
81e2a6af901e add section
ryokka
parents: 1
diff changeset
413 $ While (λ env → lt zero (varn env ) )
81e2a6af901e add section
ryokka
parents: 1
diff changeset
414 (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} ))
81e2a6af901e add section
ryokka
parents: 1
diff changeset
415 $ PComm (λ env → record env {varn = ((varn env) - 1)} ))
81e2a6af901e add section
ryokka
parents: 1
diff changeset
416 \end{lstlisting}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
417
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
418 この Comm は Command をならべているだけである。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
419 この Comm を Agda 上で実行するため、 Code \ref{agda-hoare-interpret} のような interpreter を記述した。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
420
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
421 \begin{lstlisting}[caption=Agda での HoareLogic interpreter ,label=agda-hoare-interpret]
81e2a6af901e add section
ryokka
parents: 1
diff changeset
422 {-# TERMINATING #-}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
423 interpret : Env → Comm → Env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
424 interpret env Skip = env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
425 interpret env Abort = env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
426 interpret env (PComm x) = x env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
427 interpret env (Seq comm comm1) = interpret (interpret env comm) comm1
81e2a6af901e add section
ryokka
parents: 1
diff changeset
428 interpret env (If x then else) with x env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
429 ... | true = interpret env then
81e2a6af901e add section
ryokka
parents: 1
diff changeset
430 ... | false = interpret env else
81e2a6af901e add section
ryokka
parents: 1
diff changeset
431 interpret env (While x comm) with x env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
432 ... | true = interpret (interpret env comm) (While x comm)
81e2a6af901e add section
ryokka
parents: 1
diff changeset
433 ... | false = env
81e2a6af901e add section
ryokka
parents: 1
diff changeset
434 \end{lstlisting}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
435
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
436 Code \ref{agda-hoare-interpret}は 初期状態の Env と 実行する Command の並びを受けとって、実行後の Env を返すものとなっている。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
437
81e2a6af901e add section
ryokka
parents: 1
diff changeset
438 \begin{lstlisting}[caption=Agda での HoareLogic の実行 ,label=agda-hoare-run]
81e2a6af901e add section
ryokka
parents: 1
diff changeset
439 test : Env
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
440 test = interpret ( record { vari = 0 ; varn = 0 } ) program
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
441 \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
442
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
443 Code \ref{agda-hoare-run}のように interpret に $vari = 0 , varn = 0$ の record を渡し、 実行する Comm を渡して 評価してやると$record { varn = 0 ; vari = 10 }$ のような Env が返ってくる。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
444
81e2a6af901e add section
ryokka
parents: 1
diff changeset
445 次に先程書いたプログラムの証明について記述する。
81e2a6af901e add section
ryokka
parents: 1
diff changeset
446
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
447 Code \ref{agda-hoare-rule} は Agda 上での HoareLogic での証明の構成である。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
448 HTProof では Condition と Command もう一つ Condition を受け取って、 Set を返す Agda のデータである。
81e2a6af901e add section
ryokka
parents: 1
diff changeset
449 -- これは Pre と Post の Condition を Command で変化させる
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
450 ここでの HTProof \cite{agda2-hoare} も Agda2 に移植されたものを使っている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
451
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
452 PrimRule は Code \ref{axiom-taut} の Axiom という関数を使い、事前条件が成り立っている時、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
453 実行後に事後条件が成り立つならば、 PComm で変数に値を代入できることを保証している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
454
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
455 SkipRule は Condition を受け取ってそのままの Condition を返すことを保証する。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
456
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
457 AbortRule は PreContition を受け取って、Abort を実行して終わるルールである。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
458
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
459 WeakeningRule は \ref{axiom-taut} の Tautology という関数を使って通常の逐次処理から、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
460 WhileRule のみに適応されるループ不変変数に移行する際のルールである。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
461
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
462 SeqRule は3つの Condition と 2つの Command を受け取り、これらのプログラムの逐次的な実行を保証する。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
463
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
464 IfRule は分岐に用いられ、3つの Condition と 2つの Command を受け取り、判定の Condition が成り立っているかいないかで実行する Command を変えるルールである。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
465 この時、どちらかの Command が実行されることを保証している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
466
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
467 WhileRule はループに用いられ、1つの Command と2つの Condition を受け取り、事前条件が成り立っている間、 Command を繰り返すことを保証している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
468
9
ryokka
parents: 8
diff changeset
469 \lstinputlisting[caption=Axiom と Tautology,label=axiom-taut]{src/axiom-taut.agda.replaced}
ryokka
parents: 8
diff changeset
470 %% \begin{lstlisting}[caption=Axiom と Tautology,label=axiom-taut]
ryokka
parents: 8
diff changeset
471 %% _⇒_ : Bool → Bool → Bool
ryokka
parents: 8
diff changeset
472 %% false ⇒ _ = true
ryokka
parents: 8
diff changeset
473 %% true ⇒ true = true
ryokka
parents: 8
diff changeset
474 %% true ⇒ false = false
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
475
9
ryokka
parents: 8
diff changeset
476 %% Axiom : Cond -> PrimComm -> Cond -> Set
ryokka
parents: 8
diff changeset
477 %% Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
478
9
ryokka
parents: 8
diff changeset
479 %% Tautology : Cond -> Cond -> Set
ryokka
parents: 8
diff changeset
480 %% Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true
ryokka
parents: 8
diff changeset
481 %% \end{lstlisting}
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
482
81e2a6af901e add section
ryokka
parents: 1
diff changeset
483 \begin{lstlisting}[caption=Agda での HoareLogic の構成,label=agda-hoare-rule]
81e2a6af901e add section
ryokka
parents: 1
diff changeset
484 data HTProof : Cond -> Comm -> Cond -> Set where
81e2a6af901e add section
ryokka
parents: 1
diff changeset
485 PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
486 (pr : Axiom bPre pcm bPost) ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
487 HTProof bPre (PComm pcm) bPost
81e2a6af901e add section
ryokka
parents: 1
diff changeset
488 SkipRule : (b : Cond) -> HTProof b Skip b
81e2a6af901e add section
ryokka
parents: 1
diff changeset
489 AbortRule : (bPre : Cond) -> (bPost : Cond) ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
490 HTProof bPre Abort bPost
81e2a6af901e add section
ryokka
parents: 1
diff changeset
491 WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
492 {bPost' : Cond} -> {bPost : Cond} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
493 Tautology bPre bPre' ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
494 HTProof bPre' cm bPost' ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
495 Tautology bPost' bPost ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
496 HTProof bPre cm bPost
81e2a6af901e add section
ryokka
parents: 1
diff changeset
497 SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
498 {cm2 : Comm} -> {bPost : Cond} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
499 HTProof bPre cm1 bMid ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
500 HTProof bMid cm2 bPost ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
501 HTProof bPre (Seq cm1 cm2) bPost
81e2a6af901e add section
ryokka
parents: 1
diff changeset
502 IfRule : {cmThen : Comm} -> {cmElse : Comm} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
503 {bPre : Cond} -> {bPost : Cond} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
504 {b : Cond} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
505 HTProof (bPre /\ b) cmThen bPost ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
506 HTProof (bPre /\ neg b) cmElse bPost ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
507 HTProof bPre (If b cmThen cmElse) bPost
81e2a6af901e add section
ryokka
parents: 1
diff changeset
508 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
509 HTProof (bInv /\ b) cm bInv ->
81e2a6af901e add section
ryokka
parents: 1
diff changeset
510 HTProof bInv (While b cm) (bInv /\ neg b)
81e2a6af901e add section
ryokka
parents: 1
diff changeset
511 \end{lstlisting}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
512
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
513 Code \ref{agda-hoare-rule}を使って Code \ref{agda-while}の whileProgram を証明する。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
514
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
515 全体の証明は Code \ref{agda-hoare-while}の proof1 の様になる。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
516 proof1 では型で initCond、 Code \ref{agda-hoare-prog}のprogram、 termCond を記述しており、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
517 initCond から program を実行し termCond に行き着く HoareLogic の証明になっている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
518
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
519 それぞれの Condition は Rule の後に記述されている {} に囲まれた部分で、
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
520 initCondのみ無条件で true を返す Condition になっている。
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
521
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
522 それぞれの Rule の中にそこで証明する必要のある補題が lemma で埋められている。
9
ryokka
parents: 8
diff changeset
523 lemma1 から lemma5 の証明は幅を取ってしまうため、 詳細は当研究室レポジトリ \cite{cr-ryukyu} のプログラムを参照していただきたい。
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
524
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
525 これらの lemma は HTProof の Rule に沿って必要なものを記述されており、
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
526 lemma1 では PreCondition と PostCondition が存在するときの代入の保証、
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
527 lemma2 では While Loop に入る前の Condition からループ不変条件への変換の証明、
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
528 lemma3 では While Loop 内での PComm の代入の証明、
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
529 lemma4 では While Loop を抜けたときの Condition の整合性、
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
530 lemma5 では While Loop を抜けた後のループ不変条件からCondition への変換と termCond への移行の整合性を保証している。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
531
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
532 \begin{lstlisting}[caption=Agda 上での WhileLoop の検証,label=agda-hoare-while]
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
533 proof1 : HTProof initCond program termCond
81e2a6af901e add section
ryokka
parents: 1
diff changeset
534 proof1 =
81e2a6af901e add section
ryokka
parents: 1
diff changeset
535 SeqRule {λ e → true} ( PrimRule empty-case )
81e2a6af901e add section
ryokka
parents: 1
diff changeset
536 $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 )
81e2a6af901e add section
ryokka
parents: 1
diff changeset
537 $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 (
81e2a6af901e add section
ryokka
parents: 1
diff changeset
538 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
539 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 )
81e2a6af901e add section
ryokka
parents: 1
diff changeset
540 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5
81e2a6af901e add section
ryokka
parents: 1
diff changeset
541 \end{lstlisting}
81e2a6af901e add section
ryokka
parents: 1
diff changeset
542
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
543 %% \begin{lstlisting}[caption=whileProgram Condition, label=while-cond]
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
544 %% initCond : Cond
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
545 %% initCond env = true
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
546
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
547 %% stmt1Cond : {c10 : ℕ} → Cond
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
548 %% stmt1Cond {c10} env = Equal (varn env) c10
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
549
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
550 %% init-case : {c10 : ℕ} → (env : Env) → (( λ e → true ⇒ stmt1Cond {c10} e ) (record { varn = c10 ; vari \
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
551 %% = vari env }) ) ≡ true
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
552 %% init-case {c10} _ = impl⇒ ( λ cond → ≡→Equal refl )
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
553
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
554 %% init-type : {c10 : ℕ} → Axiom (λ env → true) (λ env → record { varn = c10 ; vari = vari env }) (stmt1Co\
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
555 %% nd {c10})
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
556 %% init-type {c10} env = init-case env
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
557
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
558 %% stmt2Cond : {c10 : ℕ} → Cond
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
559 %% stmt2Cond {c10} env = (Equal (varn env) c10) ∧ (Equal (vari env) 0)
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
560
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
561 %% whileInv : {c10 : ℕ} → Cond
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
562 %% whileInv {c10} env = Equal ((varn env) + (vari env)) c10
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
563
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
564 %% whileInv' : {c10 : ℕ} → Cond
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
565 %% whileInv' {c10} env = Equal ((varn env) + (vari env)) (suc c10) ∧ lt zero (varn env)
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
566
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
567 %% termCond : {c10 : ℕ} → Cond
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
568 %% termCond {c10} env = Equal (vari env) c10
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
569 %% \end{lstlisting}
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
570
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
571 %% \begin{lstlisting}[caption=proof1 の lemma ,label=agda-hoare-while-lemma]
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
572 %% lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10})
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
573 %% (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10})
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
574 %% lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
575 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
576 %% (Equal (varn env) c10 ) ∧ true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
577 %% ≡⟨ ∧true ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
578 %% Equal (varn env) c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
579 %% ≡⟨ cond ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
580 %% true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
581 %% ∎ )
4
ryokka
parents: 2
diff changeset
582
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
583 %% lemma21 : {env : Env } → {c10 : ℕ} → stmt2Cond env ≡ true → varn env ≡ c10
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
584 %% lemma21 eq = Equal→≡ (∧-pi1 eq)
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
585 %% lemma22 : {env : Env } → {c10 : ℕ} → stmt2Cond {c10} env ≡ true → vari env ≡ 0
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
586 %% lemma22 eq = Equal→≡ (∧-pi2 eq)
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
587 %% lemma23 : {env : Env } → {c10 : ℕ} → stmt2Cond env ≡ true → varn env + vari env ≡ c10
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
588 %% lemma23 {env} {c10} eq = let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
589 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
590 %% varn env + vari env
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
591 %% ≡⟨ cong ( \ x -> x + vari env ) (lemma21 eq ) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
592 %% c10 + vari env
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
593 %% ≡⟨ cong ( \ x -> c10 + x) (lemma22 {env} {c10} eq ) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
594 %% c10 + 0
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
595 %% ≡⟨ +-sym {c10} {0} ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
596 %% 0 + c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
597 %% ≡⟨⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
598 %% c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
599 %% ∎
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
600 %% lemma2 : {c10 : ℕ} → Tautology stmt2Cond whileInv
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
601 %% lemma2 {c10} env = bool-case (stmt2Cond env) (
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
602 %% λ eq → let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
603 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
604 %% (stmt2Cond env) ⇒ (whileInv env)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
605 %% ≡⟨⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
606 %% (stmt2Cond env) ⇒ ( Equal (varn env + vari env) c10 )
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
607 %% ≡⟨ cong ( \ x -> (stmt2Cond {c10} env) ⇒ ( Equal x c10 ) ) ( lemma23 {env} eq ) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
608 %% (stmt2Cond env) ⇒ (Equal c10 c10)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
609 %% ≡⟨ cong ( \ x -> (stmt2Cond {c10} env) ⇒ x ) (≡→Equal refl ) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
610 %% (stmt2Cond {c10} env) ⇒ true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
611 %% ≡⟨ ⇒t ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
612 %% true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
613 %% ∎
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
614 %% ) (
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
615 %% λ ne → let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
616 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
617 %% (stmt2Cond env) ⇒ (whileInv env)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
618 %% ≡⟨ cong ( \ x -> x ⇒ (whileInv env) ) ne ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
619 %% false ⇒ (whileInv {c10} env)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
620 %% ≡⟨ f⇒ {whileInv {c10} env} ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
621 %% true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
622 %% ∎
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
623 %% )
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
624 %% lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv'
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
625 %% lemma3 env = impl⇒ ( λ cond → let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
626 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
627 %% whileInv' (record { varn = varn env ; vari = vari env + 1 })
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
628 %% ≡⟨⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
629 %% Equal (varn env + (vari env + 1)) (suc c10) ∧ (lt 0 (varn env) )
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
630 %% ≡⟨ cong ( λ z → Equal (varn env + (vari env + 1)) (suc c10) ∧ z ) (∧-pi2 cond ) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
631 %% Equal (varn env + (vari env + 1)) (suc c10) ∧ true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
632 %% ≡⟨ ∧true ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
633 %% Equal (varn env + (vari env + 1)) (suc c10)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
634 %% ≡⟨ cong ( \ x -> Equal x (suc c10) ) (sym (+-assoc (varn env) (vari env) 1)) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
635 %% Equal ((varn env + vari env) + 1) (suc c10)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
636 %% ≡⟨ cong ( \ x -> Equal x (suc c10) ) +1≡suc ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
637 %% Equal (suc (varn env + vari env)) (suc c10)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
638 %% ≡⟨ sym Equal+1 ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
639 %% Equal ((varn env + vari env) ) c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
640 %% ≡⟨ ∧-pi1 cond ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
641 %% true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
642 %% ∎ )
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
643 %% lemma41 : (env : Env ) → {c10 : ℕ} → (varn env + vari env) ≡ (suc c10) → lt 0 (varn env) ≡ true → Equal ((varn env - 1) + vari env) c10 ≡ true
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
644 %% lemma41 env {c10} c1 c2 = let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
645 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
646 %% Equal ((varn env - 1) + vari env) c10
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
647 %% ≡⟨ cong ( λ z → Equal ((z - 1 ) + vari env ) c10 ) (sym (suc-pred*ℕ*=n c2) ) ⟩
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
648 %% Equal ((suc (pred*ℕ* {varn env} c2 ) - 1) + vari env) c10
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
649 %% ≡⟨⟩
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
650 %% Equal ((pred*ℕ* {varn env} c2 ) + vari env) c10
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
651 %% ≡⟨ Equal+1 ⟩
6
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
652 %% Equal ((suc (pred*ℕ* {varn env} c2 )) + vari env) (suc c10)
dbff3c44dc88 fix some, but utf8 char invisible...
ryokka
parents: 5
diff changeset
653 %% ≡⟨ cong ( λ z → Equal (z + vari env ) (suc c10) ) (suc-pred*ℕ*=n c2 ) ⟩
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
654 %% Equal (varn env + vari env) (suc c10)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
655 %% ≡⟨ cong ( λ z → (Equal z (suc c10) )) c1 ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
656 %% Equal (suc c10) (suc c10)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
657 %% ≡⟨ ≡→Equal refl ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
658 %% true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
659 %% ∎
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
660 %% lemma4 : {c10 : ℕ} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
661 %% lemma4 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
662 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
663 %% whileInv (record { varn = varn env - 1 ; vari = vari env })
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
664 %% ≡⟨⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
665 %% Equal ((varn env - 1) + vari env) c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
666 %% ≡⟨ lemma41 env (Equal→≡ (∧-pi1 cond)) (∧-pi2 cond) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
667 %% true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
668 %% ∎
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
669 %% )
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
670 %% lemma51 : (z : Env ) → neg (λ z → lt zero (varn z)) z ≡ true → varn z ≡ zero
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
671 %% lemma51 z cond with lt zero (varn z) | (suc zero) ≤? (varn z)
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
672 %% lemma51 z () | false | yes p
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
673 %% lemma51 z () | true | yes p
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
674 %% lemma51 z refl | _ | no ¬p with varn z
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
675 %% lemma51 z refl | _ | no ¬p | zero = refl
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
676 %% lemma51 z refl | _ | no ¬p | suc x = ⊥-elim ( ¬p (s≤s z≤n ) )
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
677 %% lemma5 : {c10 : ℕ} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
678 %% lemma5 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
679 %% begin
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
680 %% termCond env
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
681 %% ≡⟨⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
682 %% Equal (vari env) c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
683 %% ≡⟨⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
684 %% Equal (zero + vari env) c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
685 %% ≡⟨ cong ( λ z → Equal (z + vari env) c10 ) (sym ( lemma51 env ( ∧-pi2 cond ) )) ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
686 %% Equal (varn env + vari env) c10
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
687 %% ≡⟨ ∧-pi1 cond ⟩
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
688 %% true
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
689 %% ∎
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
690 %% )
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
691 %% \end{lstlisting}
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
692 proof1 は Code \ref{agda-hoare-prog}の program と似た形をとっている。
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
693 HoareLogic では Comannd に対応する証明規則があるため、証明はプログラムに対応する形になる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
694
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
695 \section{Gears ベースの HoareLogic の証明}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
696 次に Gears をベースにした HoareLogic の例を見ていく。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
697 Gears を用いた記述では、 Input の DataGear 、 CodeGear、 Output の DataGearという
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
698 並びでプログラムを記述していく。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
699 そのため、Input DataGear を PreCondition、 Command を CodeGear、 Output DataGear を PostCondition と
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
700 そのまま置き換えることができる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
701
9
ryokka
parents: 8
diff changeset
702 こちらも通常の HoareLogic と同様に Code \ref{agda-while} のwhileプログラムと同様のものを記述する
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
703 Code \ref{Gears-hoare-while} は、 CodeGear、 DataGear を用いた Agda 上での while Program の記述であり、証明でもある。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
704
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
705 \lstinputlisting[caption=Gears 上での WhileLoop の記述と検証,label=Gears-hoare-while]{src/gears.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
706 %% \begin{lstlisting}[caption=Gears 上での WhileLoop の記述と検証,label=Gears-hoare-while]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
707 %% proofGears : {c10 : ℕ } → Set
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
708 %% proofGears {c10} = whileTest {_} {_} {c10} (λ n p1 → conversion1 n p1 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 ))))
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
709 %% \end{lstlisting}
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
710 Code \ref{Gears-hoare-while} で使われている CodeGear を見ていく
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
711
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
712 始めに Code \ref{gears-while} の whileTest では変数 i、n にそれぞれ 0 と 10 を代入している。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
713 whileTest は最初のCodeGear なので initCondition は true で、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
714 Code : の後ろに書かれた$(env : Env) -> ((vari env) ≡ 0) /\ ((varn env) ≡ c10)$ が PostCondition である。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
715 $\lambda$ 項の next には次のCodeGear が入り、継続される引数である env は whileTest の PostCondition であり、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
716 次の CodeGear の PreCondition にあたる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
717 conversion1 は通常の Condition からループ不変条件に移行するためのもので前のCondition である $i == 0 and n == 10$ が
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
718 成り立っている時、$i + n == 10$ を返すCodeGear となっている。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
719 whileLoop では conversion1 のループ不変条件を受け取ってWhile の条件である$0 < n$ が成り立っている間、 $i++;n++$
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
720 を行う。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
721 そして、ループを抜けた後の termCondition は $i == 10$ となる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
722
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
723 \lstinputlisting[caption=Gears whileProgram, label=gears-while]{src/gears-while.agda.replaced}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
724 %% \begin{lstlisting}[caption=Gears whileProgram, label=gears-while]
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
725 %% whileTest : {l : Level} {t : Set l} -> {c10 : ℕ } → (Code : (env : Env) ->
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
726 %% ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -> t) -> t
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
727 %% whileTest {_} {_} {c10} next = next env proof2
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
728 %% where
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
729 %% env : Env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
730 %% env = record {vari = 0 ; varn = c10}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
731 %% proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10)
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
732 %% proof2 = record {pi1 = refl ; pi2 = refl}
4
ryokka
parents: 2
diff changeset
733
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
734 %% conversion1 : {l : Level} {t : Set l } → (env : Env) -> {c10 : ℕ } → ((vari env) ≡ 0) /\ ((varn env) ≡ c\
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
735 %% 10)
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
736 %% -> (Code : (env1 : Env) -> (varn env1 + vari env1 ≡ c10) -> t) -> t
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
737 %% conversion1 env {c10} p1 next = next env proof4
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
738 %% where
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
739 %% proof4 : varn env + vari env ≡ c10
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
740 %% proof4 = let open ≡-Reasoning in
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
741 %% begin
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
742 %% varn env + vari env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
743 %% ≡⟨ cong ( λ n → n + vari env ) (pi2 p1 ) ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
744 %% c10 + vari env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
745 %% ≡⟨ cong ( λ n → c10 + n ) (pi1 p1 ) ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
746 %% c10 + 0
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
747 %% ≡⟨ +-sym {c10} {0} ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
748 %% c10
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
749 %% ∎
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
750
8
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
751 %% {-# TERMINATING #-}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
752 %% whileLoop : {l : Level} {t : Set l} -> (env : Env) -> {c10 : ℕ } → ((varn env) + (vari env) ≡ c10) -> (Co\
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
753 %% de : Env -> t) -> t
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
754 %% whileLoop env proof next with ( suc zero ≤? (varn env) )
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
755 %% whileLoop env proof next | no p = next env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
756 %% whileLoop env {c10} proof next | yes p = whileLoop env1 (proof3 p ) next
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
757 %% where
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
758 %% env1 = record {varn = (varn env) - 1 ; vari = (vari env) + 1}
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
759 %% 1<0 : 1 ≤ zero → ⊥
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
760 %% 1<0 ()
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
761 %% proof3 : (suc zero ≤ (varn env)) → varn env1 + vari env1 ≡ c10
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
762 %% proof3 (s≤s lt) with varn env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
763 %% proof3 (s≤s z≤n) | zero = ⊥-elim (1<0 p)
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
764 %% proof3 (s≤s (z≤n {n'}) ) | suc n = let open ≡-Reasoning in
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
765 %% begin
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
766 %% n' + (vari env + 1)
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
767 %% ≡⟨ cong ( λ z → n' + z ) ( +-sym {vari env} {1} ) ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
768 %% n' + (1 + vari env )
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
769 %% ≡⟨ sym ( +-assoc (n') 1 (vari env) ) ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
770 %% (n' + 1) + vari env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
771 %% ≡⟨ cong ( λ z → z + vari env ) +1≡suc ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
772 %% (suc n' ) + vari env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
773 %% ≡⟨⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
774 %% varn env + vari env
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
775 %% ≡⟨ proof ⟩
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
776 %% c10
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
777 %% ∎
83d000399c9d fix invisible char
ryokka
parents: 6
diff changeset
778 %% \end{lstlisting}
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
779
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
780
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
781 \section{まとめと今後の課題}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
782 本研究では Agda 上で HoareLogic のwhileを使った例題を作成し、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
783 証明を行なった。
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
784
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
785 また、 Gears を用いた HoareLogic を記述することができた。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
786 さらに、Gears を用いてHoareLocic 記述で、
9
ryokka
parents: 8
diff changeset
787 証明を引数として受け渡して記述することで、証明とプログラムを一体化することができた。
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
788
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
789 今後の課題としては GearsOS の検証のために、
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
790 RedBlackTree や SynchronizedQueue などのデータ構造の検証をHoareLogic ベースで行うことなどが挙げられる。
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
791 %% 特に SynchronizedQueue の検証のために、 並列なプログラムを状態遷移に変換する。
2
81e2a6af901e add section
ryokka
parents: 1
diff changeset
792
5
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
793 \nocite{*}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
794 \bibliography{tecrep}{}
493983f2c9db fix abstruct and more
ryokka
parents: 4
diff changeset
795 \bibliographystyle{plain}
0
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
796
6e03fff298c5 move template Paper/
ryokka
parents:
diff changeset
797 \end{document}