annotate slide/slide.md @ 11:8a97e69f8615

いったんスライドは完成
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Thu, 06 Jan 2022 16:57:53 +0900
parents 60d4617eac84
children 62e56d73f104
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 ---
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 marp: true
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 title: Geas Agda による Left Learning Red Black Tree の検証
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 paginate: true
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 theme: default
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 size: 16:9
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 style: |
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 section {
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 background-color: #FFFFFF;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 font-size: 28px;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 color: #4b4b4b;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 font-family: "Droid Sans Mono", "Hiragino Maru Gothic ProN";
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 background-image: url("logo.svg");
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 background-position: right 3% bottom 2%;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 background-repeat: no-repeat;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 background-attachment: 5%;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 background-size: 20% auto;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 }
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 section.title h1 {
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 color: #808db5;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 text-align: center;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 }
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 section.title p {
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 bottom: 25%;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 width: 100%;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 position: absolute;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 font-size: 25px;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 color: #4b4b4b;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 background: linear-gradient(transparent 90%, #ffcc00 0%);
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 }
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 section.slide h1 {
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 width: 95%;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 color: white;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 background-color: #808db5;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 position: absolute;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 left: 50px;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 top: 35px;
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 }
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
44 section.fig_cg p {
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
45 top: 300px;
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
46 text-align: center;
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
47 }
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
48
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 ---
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 <!-- headingDivider: 1 -->
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 # Gears Agda による <br> Left Learning Red Black Tree の検証
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 <!-- class: title -->
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 Uechi Yuto, Shinji Kono 琉球大学
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 # 証明を用いてプログラムの信頼性の向上を目指す
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 <!-- class: slide -->
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 <!-- 研究目的 -->
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 - プログラムの信頼性を高めることは重要な課題である
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 - 信頼性を高める手法として「モデル検査」や「定理証明」など
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 - 当研究室でCbCという言語を開発している
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 - C言語からループ構造とサブルーチンを取り除き、継続を導入したC言語の下位言語となる
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 - 先行研究では Hoare Logic を用いて 簡単なプログラムの検証を行った
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
66 - 本研究では Gears Agda にて重要なアルゴリズムの一つである Red Black Tree を検証する
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
67
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
68 # CbC について
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
69 - CbCとは当研究室で開発しているC言語の下位言語
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
70 - CbC とは C 言語からループ制御構造とサブルーチンコールを取り除き、継続を導入したC 言語の下位言語
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
71 - 継続呼び出しは引数付き goto 文で表現される。
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
72 - 処理の単位を Code Gear, データの単位を Data Gear として記述するプログラミング言語
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
73 - CbC のプログラミングでは Data Gear を Code Gear で変更し、その変更を次の Code Gear に渡して処理を行う。
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
74
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
75
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
76 # Agda の基本
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
77 - Agdaとは定理証明支援器であり、関数型言語
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
78 - Agdaでの関数は、最初に型について定義した後に、関数を定義する事で記述する
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
79 - これが Curry-Howard 対応となる
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
80 - 型の定義部分で、入力と出力の型を定義できる
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
81 - input → output のようになる
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
82 - 関数の定義は = を用いて行う
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
83 - 関数名の後、 = の前で受け取る引数を記述します
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
84
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
85 <!--
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
86 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
87 sample1 : (A : Set ) → Set
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
88 sample1 a = a
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
89
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
90 sample2 : (A : Set ) → (B : Set ) → Set
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
91 sample2 a b = b
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
92 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
93 -->
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
94
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
95 # Agda の基本 record
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
96 オブジェクトあるいは構造体
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
97 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
98 record Env : Set where
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
99 field
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
100 varn : N
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
101 vari : N
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
102 open Env
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
103 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
104
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
105 型に対応する値の導入(intro)
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
106 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
107 record {varx = zero ; vary = suc zero}
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
108 ```
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
109 record の値のアクセス(elim)
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
110 ```
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
111 (env : Env) → varx env
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
112 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
113
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
115
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 # Gears Agda の記法
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
117 Gears Agda では CbC と対応させるためにすべてLoopで記述する
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
118 loopは`→ t`の形式で表現する
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
119 再起呼び出しは使わない(構文的には禁止していないので注意が必要)
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
120 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
121 {-# TERMINATING #-}
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
122 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
123 whileLoop env next with lt 0 (varn env)
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
124 whileLoop env next | false = next env
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
125 whileLoop env next | true = whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
126 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
127 - t を返すことで継続を表す(tは呼び出し時に任意に指定してもよい. testに使える)
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
128 - tail call により light weight continuation を定義している
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
129
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
130
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
131 # Gears Agda と Gears CbC の対応
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
132 Gears Agda
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
133 - 証明向きの記述
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
134 - Hoare Condition を含む
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
135
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
136 Gears CbC
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
137 - 実行向きの記述
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
138 - メモリ管理, 並列実行を含む
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
139
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
140 Context
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
141 - processに相当する
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
142 - Code Gear 単位で並列実行
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
144
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
145 # Normal level と Meta Level を用いた信頼性の向上
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
146 Normal Level
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
147 - 軽量継続
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
148 - Code Gear 単位で関数型プログラミングとなる
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
149 - atomic(Code Gear 自体の実行は割り込まれない)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
150 - ポインタの操作は含まれない
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
151
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
152 Meta Level
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
153 - メモリやCPUなどの資源管理, ポインタ操作
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
154 - Hoare Condition と証明
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
155 - Contextによる並列実行
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
156 - monadに相当するData構造
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
157
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
158 #
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
159 <!-- class: fig_cg -->
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
160 ![height:700px](meta_cg_dg.svg)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
161
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
162 # Gears Agda と Hoare Logic
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
163 <!-- class: slide -->
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
164 C.A.R Hoare, R.W Floyd が考案
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
165 - Pre Condition → Command → Post Condition
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
166
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
167 Gears Agda による Command の例
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
168 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
169 {-# TERMINATING #-}
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
170 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
171 whileLoop env next with lt 0 (varn env)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
172 whileLoop env next | false = next env
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
173 whileLoop env next | true = whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
174 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
175 - `{-# TERMINATING #-}`
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
176 - with 文
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
177 - 型と値
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
178
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
179 # Gears Agda の Pre Condition Post Condition
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
180 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
181 whileLoopSeg : {l : Level} {t : Set l} → {c10 : N } → (env : Env) → (varn env + vari env ≡ c10)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
182 → (next : (e1 : Env )→ varn e1 + vari e1 ≡ c10 → varn e1 < varn env → t)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
183 → (exit : (e1 : Env )→ vari e1 ≡ c10 → t) → t
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
184 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
185 - Terminatingを避けるためにloopを分割
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
186 - `varn env + vari env ≡ c10` が Pre Condition
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
187 - `varn e1 + vari e1 ≡ c10` が Post Condition
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
188 - `varn e1 < varn env → t` が停止を保証する減少列
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
189
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
190 これは命題なので証明を与えてPre ConditionからPost Conditionを導出する必要がある
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
191 証明は値として次のCodeGearに渡される
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
192
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
193 # Loop の接続
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
194 分割したloopを接続するMeta Code Gearを作成する
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
195 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
196 TerminatingLoopS : {l : Level} {t : Set l} ( Index : Set )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
197 → {Invraiant : Index → Set } → ( reduce : Index → N)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
198 → (loop : (r : Index) → Invraiant r
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
199 → (next : (r1 : Index) → Invraiant r1 → reduce r1 < reduce r → t ) → t)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
200 → (r : Index) → (p : Invraiant r) → t
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
201 ```
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
202 - IndexはLoop変数
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
203 - Invariantはloop変数の不変条件
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
204 - loopに接続するCode Gearを与える
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
205 - reduceは停止性を保証する減少列
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
206
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
207 これを一般的に証明することができている
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
208
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
209 # 実際のloopの接続
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
210 証明したい性質を以下のように記述する
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
211 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
212 whileTestSpec1 : (c10 : N) → (e1 : Env ) → vari e1 ≡ c10 → ⊤
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
213 whileTestSpec1 _ _ x = tt
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
214 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
215 loopをTerminatingLoopSで接続して仕様記述に繋げる
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
216 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
217 proofGearsTermS : {c10 : N} → ⊤
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
218 proofGearsTermS {c10} = whileTest' {_} {_} {c10} (λ n p → conversion1 n p (λ n1 p1 →
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
219 TerminatingLoopS Env (λ env → varn env)(λ n2 p2 loop → whileLoopSeg {_} {_} {c10} n2 p2 loop
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
220 (λ ne pe → whileTestSpec1 c10 ne pe)) n1 p1 ))
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
221 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
222 - conversion1はPre Condition をPost Conditionに変換する
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
223 - whileLoopSeg
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
224 - ⊤
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
225
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
226 # test との違い
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
227 - test では実数を与えた際の出力が仕様に沿ったものであるかを検証する
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
228 - コーナーケースで仕様に沿った動きをしていない場合を考慮できない
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
229 - 今回の定理証明を用いた証明では実数を必要としない
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
230 - そのため、入力の型の範囲全てに対して仕様を満たしているか検証できる
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
231
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
232
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
233 # Gears Agda による BinaryTree の実装
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
234 CbCと並行した実装をするため、Stackを明示した実装をする
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
235
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
236 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
237 find : {n m : Level} {A : Set n} {t : Set m} → (key : ℕ) → (tree : bt A ) → List (bt A)
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
238 → (next : bt A → List (bt A) → t ) → (exit : bt A → List (bt A) → t ) → t
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
239 find key leaf st _ exit = exit leaf st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
240 find key (node key₁ v1 tree tree₁) st next exit with <-cmp key key₁
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
241 find key n st _ exit | tri≈ ¬a b ¬c = exit n st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
242 find key n@(node key₁ v1 tree tree₁) st next _ | tri< a ¬b ¬c = next tree (n ∷ st)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
243 find key n@(node key₁ v1 tree tree₁) st next _ | tri> ¬a ¬b c = next tree₁ (n ∷ st)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
244 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
245 置き換えるnodeまでTreeを辿り、Stackに逆順にTreeを積んでいく
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
246
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
247 <!--
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
248 findは全部書いても大丈夫そう
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
249 -->
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
250
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
251 # Gears Agda による BinaryTree の実装 replace node
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
252 置き換えたnodeをStackを解消しながらTreeを再構成する
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
253 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
254 replace : {n m : Level} {A : Set n} {t : Set m}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
255 → (key : N) → (value : A) → bt A → List (bt A)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
256 → (next : N → A → bt A → List (bt A) → t )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
257 → (exit : bt A → t) → t
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
258 replace key value repl [] next exit = exit repl -- can't happen
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
259 replace key value repl (leaf ∷ []) next exit = exit repl
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
260 replace key value repl (node key₁ value₁ left right ∷ []) next exit with <-cmp key key₁
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
261 ... | tri< a ¬b ¬c = exit (node key₁ value₁ repl right )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
262 ... | tri≈ ¬a b ¬c = exit (node key₁ value left right )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
263 ... | tri> ¬a ¬b c = exit (node key₁ value₁ left repl )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
264 replace key value repl (leaf ∷ st) next exit = next key value repl st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
265 replace key value repl (node key₁ value₁ left right ∷ st) next exit with <-cmp key key₁
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
266 ... | tri< a ¬b ¬c = next key value (node key₁ value₁ repl right ) st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
267 ... | tri≈ ¬a b ¬c = next key value (node key₁ value left right ) st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
268 ... | tri> ¬a ¬b c = next key value (node key₁ value₁ left repl ) st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
269 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
270
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
272 <!--
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
273 これは途中省略してよさそう
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
274 -->
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
275
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
276 # Binary Tree の3種類の Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
277 Tree Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
278 - Binary Tree が Key の順序に沿って構成されていることを表すData構造
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
279
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
280 Stack Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
281 - Stackが木の昇順に構成されていることを表す
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
282
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
283 Replace Tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
284 - 2つの木の1つのnodeが入れ替わっていることを示す
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
285
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
286 # Tree Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
287 - Invariant というよりも可能な Binary Tree 全体の集合を表す型
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
288 - 制約付きのBinary Tree
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
289 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
290 data treeInvariant {n : Level} {A : Set n} : (tree : bt A) → Set n where
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
291 t-leaf : treeInvariant leaf
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
292 t-single : (key : N) → (value : A) → treeInvariant (node key value leaf leaf)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
293 t-right : {key key₁ : N} → {value value₁ : A} → {t₁ t₂ : bt A} → (key < key₁)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
294 → treeInvariant (node key₁ value₁ t₁ t₂)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
295 → treeInvariant (node key value leaf (node key₁ value₁ t₁ t₂))
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
296 t-left : {key key₁ : N} → {value value₁ : A} → {t₁ t₂ : bt A} → (key < key₁)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
297 → treeInvariant (node key value t₁ t₂)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
298 → treeInvariant (node key₁ value₁ (node key value t₁ t₂) leaf )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
299 t-node : {key key₁ key₂ : N} → {value value₁ value₂ : A}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
300 → {t₁ t₂ t₃ t₄ : bt A} → (key < key₁) → (key₁ < key₂)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
301 → treeInvariant (node key value t₁ t₂)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
302 → treeInvariant (node key₂ value₂ t₃ t₄)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
303 → treeInvariant (node key₁ value₁ (node key value t₁ t₂) (node key₂ value₂ t₃ t₄))
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
304 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
305
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
306 <!--
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
307 t-leaf はコンストラクタ
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
308
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
309
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
310 コードの解説
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
311 省略した方がたぶん絶対良い
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
312 right と left なんかはほとんど対照的なので省略とかでよさそう
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
313 あとは、木構造の仕様を満たすためにData型になっている説明があるとよさそう
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
314 -->
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
315
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
316
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
317 # Stack Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
318 - StackにはTreeを辿った履歴が残っている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
319 - 辿り方はKeyの値に依存する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
320 - 実際のStackよりも豊富な情報を持っている<!--Keyの比較が入っているから-->
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
321
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
322 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
323 data stackInvariant {n : Level} {A : Set n} (key : N) : (top orig : bt A)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
324 → (stack : List (bt A)) → Set n where
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
325 s-single : {tree0 : bt A} → stackInvariant key tree0 tree0 (tree0 ∷ [])
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
326 s-right : {tree tree0 tree₁ : bt A} → {key₁ : N } → {v1 : A } → {st : List (bt A)}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
327 → key₁ < key → stackInvariant key (node key₁ v1 tree₁ tree) tree0 st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
328 → stackInvariant key tree tree0 (tree ∷ st)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
329 s-left : {tree₁ tree0 tree : bt A} → {key₁ : N } → {v1 : A } → {st : List (bt A)}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
330 → key < key₁ → stackInvariant key (node key₁ v1 tree₁ tree) tree0 st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
331 → stackInvariant key tree₁ tree0 (tree₁ ∷ st)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
332 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
333
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
334 # Replace Tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
335 - 木の特定のnodeが正しく置き換えられているか
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
336 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
337 data replacedTree {n : Level} {A : Set n} (key : N) (value : A) : (before after : bt A) → Set n where
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
338 r-leaf : replacedTree key value leaf (node key value leaf leaf)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
339 r-node : {value₁ : A} → {t t₁ : bt A}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
340 → replacedTree key value (node key value₁ t t₁) (node key value t t₁)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
341 r-right : {k : N } {v1 : A} → {t t1 t2 : bt A}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
342 → k < key → replacedTree key value t2 t
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
343 → replacedTree key value (node k v1 t1 t2) (node k v1 t1 t)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
344 r-left : {k : N } {v1 : A} → {t t1 t2 : bt A}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
345 → key < k → replacedTree key value t1 t
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
346 → replacedTree key value (node k v1 t1 t2) (node k v1 t t2)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
347 ```
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
349 # find の Hoare Condition
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
350 findPでは treeInvariant をつかって stackInvariant を生成する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
351 停止性を証明する木の深さの不等式も証明する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
352 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
353 findP : {n m : Level} {A : Set n} {t : Set m} → (key : ℕ) → (tree tree0 : bt A ) → (stack : List (bt A))
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
354 → treeInvariant tree ∧ stackInvariant key tree tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
355 → (next : (tree1 : bt A) → (stack : List (bt A))
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
356 → treeInvariant tree1 ∧ stackInvariant key tree1 tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
357 → bt-depth tree1 < bt-depth tree → t )
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
358 → (exit : (tree1 : bt A) → (stack : List (bt A))
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
359 → treeInvariant tree1 ∧ stackInvariant key tree1 tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
360 → (tree1 ≡ leaf ) ∨ ( node-key tree1 ≡ just key ) → t ) → t
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
361 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
362
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
363 # Hoare Condition の拡張
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
364 testなどでは仮定が入ることがある
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
365 Hoare Conditionを拡張可能な部分があるrecordで定義する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
366 Cが拡張される部分で, これはDataの継続に相当する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
367 Code Gear に継続があるように Data Gearにも継続がある
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
368 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
369 record findPR {n : Level} {A : Set n} (key : ℕ) (tree : bt A ) (stack : List (bt A))
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
370 (C : ℕ → bt A → List (bt A) → Set n) : Set n where
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
371 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
372 tree0 : bt A
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
373 ti0 : treeInvariant tree0
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
374 ti : treeInvariant tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
375 si : stackInvariant key tree tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
376 ci : C key tree stack -- data continuation
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
377 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
378
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
379 # 拡張部分の記述と推論
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
380 拡張部分はrecord findPC で定義する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
381 拡張部分の推論はrecord findExt で定義する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
382 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
383 record findPC {n : Level} {A : Set n} (value : A) (key1 : ℕ) (tree : bt A ) (stack : List (bt A)) : Set n where
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
384 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
385 tree1 : bt A
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
386 ci : replacedTree key1 value tree1 tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
387
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
388 record findExt {n : Level} {A : Set n} (key : ℕ) (C : ℕ → bt A → List (bt A) → Set n) : Set (Level.suc n) where
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
389 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
390 c1 : {key₁ : ℕ} {tree tree₁ : bt A } {st : List (bt A)} {v1 : A}
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
391 → findPR key (node key₁ v1 tree tree₁) st C → key < key₁ → C key tree (tree ∷ st)
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
392 c2 : {key₁ : ℕ} {tree tree₁ : bt A } {st : List (bt A)} {v1 : A}
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
393 → findPR key (node key₁ v1 tree tree₁) st C → key > key₁ → C key tree₁ (tree₁ ∷ st)
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
394 ```
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
395
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
396 # replade Node の Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
397 repraceTree は置き換えるべきnodeが実行時に決まるので関数を挟んだInvariantになる
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
398 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
399 child-replaced : {n : Level} {A : Set n} (key : ℕ) (tree : bt A) → bt A
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
400 child-replaced key leaf = leaf
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
401 child-replaced key (node key₁ value left right) with <-cmp key key₁
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
402 ... | tri< a ¬b ¬c = left
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
403 ... | tri≈ ¬a b ¬c = node key₁ value left right
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
404 ... | tri> ¬a ¬b c = right
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
405
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
406 record replacePR {n : Level} {A : Set n} (key : ℕ) (value : A) (tree repl : bt A )
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
407 (stack : List (bt A)) (C : bt A → bt A → List (bt A) → Set n) : Set n where
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
408 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
409 tree0 : bt A
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
410 ti : treeInvariant tree0
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
411 si : stackInvariant key tree tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
412 ri : replacedTree key value (child-replaced key tree ) repl
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
413 ci : C tree repl stack -- data continuation
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
414 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
415
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
416 # 最終的な証明コード
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
417 insertしたkeyをfindすると元の値が取れてくることを証明する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
418 insertTreeSpec0が仕様
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
419 conteinsTreeがtestコードかつ証明になっている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
420 証明の詳細はコードのHoara condition の証明に入っている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
421 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
422 insertTreeSpec0 : {n : Level} {A : Set n} → (tree : bt A) → (value : A)
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
423 → top-value tree ≡ just value → ⊤
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
424 insertTreeSpec0 _ _ _ = tt
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
425
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
426 containsTree : {n : Level} {A : Set n} → (tree tree1 : bt A) → (key : ℕ) → (value : A)
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
427 → treeInvariant tree1 → replacedTree key value tree1 tree → ⊤
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
428 containsTree {n} {A} tree tree1 key value P RT =
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
429 TerminatingLoopS (bt A ∧ List (bt A) )
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
430 {λ p → findPR key (proj1 p) (proj2 p) (findPC value ) } (λ p → bt-depth (proj1 p))
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
431 ⟪ tree , tree ∷ [] ⟫ ?
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
432 $ λ p P loop → findPPC1 key value (proj1 p) (proj2 p) P (λ t s P1 lt → loop ⟪ t , s ⟫ P1 lt )
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
433 $ λ t1 s1 P2 found? → insertTreeSpec0 t1 value (lemma6 t1 s1 found? P2)
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
434 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
435
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
436 # replace Tree の性質
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
437 Replace Tree 自体は Tree に特定の値が入っていることを示すData構造になっている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
438 これをHoare条件として持ち歩くことにより、Binary Treeの詳細に立ち入らず何が入っているかを指定できる
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
439
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
440 これにより木を用いるプログラムでの証明を記述できる
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
441 insert Tree や Find Node の停止性も証明されている
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 # 今後の研究方針
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
444 - Deleteの実装
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
445 - Red Black Tree の実装
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
446 - 今回定義した条件はそのまま Red Black Tree の検証に使用できるはず
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
447 - Contextを用いた並列実行時のプログラムの正しさの証明
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
448 - syncronized queue
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
449 - concarent tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
450 - xv.6への適用
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
451 - モデル検査
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
452
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 # まとめ
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 - Gears Agda にて Binary Tree を検証することができた
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
455 - Gears Agda における Termination を使用しない実装の仕方を確率した
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
456 - Hoare Logic による検証もできるようになった
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 - 今後は Red Black Tree の検証をすすめる
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
458 - モデル検査をしたい
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
459
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
460 <!-- 英語版も欲しい-->