annotate slide/memo.md @ 23:016e82a71407

Add slide
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Tue, 07 Feb 2023 02:27:53 +0900
parents b37e4cd69468
children 83e28d9da152
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 # 目的
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
3 そのまま読むかな
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
5 # agdaの基本
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
6 たぶんここの説明全部実際のコードでやったほうがいいらしい
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
7
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
8 # record
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
9 論文にもかいてあるし三段論法を
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
10 取り扱ったほうが見る人も面白いのでは
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
11
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
12 # CbC
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
13 goto文のやつは消すかな
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
14
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
15 # normal levelとmetalevel
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
16 ポインタの操作は含まれない
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
17
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
18 上の方は normal level の実装
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
19
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
20 下の方が meta level の計算を可視化したもの
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
21
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
22 例えば、変数がメモリのある番地に存在していれば、
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
23 Meta Data Gear がその番地を持っている。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
24 (なので Data Gear に wrap されているというイメージ)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
25
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
26 Meta Code Gear がそのメモリから取り出して、
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
27
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
28 普通の Code Gear が実行をするという流れ、
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
29
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
30 後ろのほうでまた新しく保存したいデータがあれば
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
31 Meta Code Gear が保存して、
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
32
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
33 最後の Meta Data Gear が新しいデータのメモリ番地を
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
34 持っているという流れになります。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
35
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
36 プログラムをする際は上のようにシンプルな実装をするが、
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
37 実際には内部でメタ計算が走っているのが理想ですね
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
38
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
39 Gears Agda
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
40
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
41 # Gears Agda
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
42
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
43 この矢印tが Gears Agda のミソで、
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
44
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
45 この定義を見ると、While loop はEnvとCode を受け取ってtを返します。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
46
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
47 この While loop を code Gear に
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
48 見立てるなら、次に遷移する関数を指定する必要があります
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
49
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
50 それがCodeになります。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
51 なので、Gears Agda では次に受け取る関数を受け取る用にしていて、それがnextになります。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
52
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
53 このようにして、CbC の継続という概念を
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
54 矢印tで表現しています。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
55
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
56 (CbCのCodeGear はDataGearをうけとってそれを元に実行することはnextがEnvを受け取って実行すること)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
57
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
58 (CodeGear の実行終了時に、次の CodeGearに
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
59 DataGearを与えることもnextにEnvを与えていることからわかると思います)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
60
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
61
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
62 <!-- 実行の文を持ってくるんだっけな -->
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
63
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
64 - with 文
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
65 with文で展開してパターンマッチすることもできる。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
66 ここでは less than がそれにあたる
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
67 0とvarnを比較して
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
68 false だった場合、trueだった場合をcase文のように
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
69 書ける
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
70
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
71 - `{-# TERMINATING #-}`
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
72 Agdaが停止性を理解できない場合に、このようにアノテーションすることで停止することを示せます
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
73
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
74 # loopの接続
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
75
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
76 reduceがあるため、Agdaは
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
77
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
78 で、前回のものは最初から構造体(record)に値が格納されている状態から始まっていたので
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
79 proofGearsTermS では、入力が自然数で、recordの定義から検証を行っている
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
80
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
81 そしてそれを行っているのが最初の関数であるwhileTest'で
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
82 ここでvarnが入力c10と一致し、variが0であることを証明している
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
83
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
84 次の関数であるversionでは、whileTest'のrecord定義時のConditionから
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
85
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
86 loop時のconditionを生成しています
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
87
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
88 - これで Gears Agda にて While Loop を Hoare Logic を使って検証することができた。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
89
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
90 # テストと定理証明の違い
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
91
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
92 # 定理証明とモデル検査の違い
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
93
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
94 # DPPの実装
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
95 pidは哲学者をindexで管理するために必要
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
96 どの哲学者がどのフォークを取るのか決まっているため