annotate slide/slide.md @ 12:62e56d73f104

WIP カンペを追加 14ページまで
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Fri, 07 Jan 2022 00:58:07 +0900
parents 8a97e69f8615
children 76c3378c61dc
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 - 型の定義部分で、入力と出力の型を定義できる
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
80 - input → output のようになる
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
81 - 関数の定義は = を用いて行う
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
82 - 関数名の後、 = の前で受け取る引数を記述します
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
83
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
84 <!--
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
85 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
86 sample1 : (A : Set ) → Set
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
87 sample1 a = a
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
88
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
89 sample2 : (A : Set ) → (B : Set ) → Set
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
90 sample2 a b = b
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
91 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
92 -->
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
93
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
94 # Agda の基本 record
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
95 オブジェクトあるいは構造体
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
96 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
97 record Env : Set where
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
98 field
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
99 varn : N
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
100 vari : N
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
101 open Env
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
102 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
103
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
104 型に対応する値の導入(intro)
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
105 ```
12
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
106 record {varn = zero ; vari = suc zero}
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
107 ```
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
108 record の値のアクセス(elim)
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
109 ```
12
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
110 (env : Env) → varn env
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
111 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
112
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
113
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
114
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 # Gears Agda の記法
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
116 Gears Agda では CbC と対応させるためにすべてLoopで記述する
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
117 loopは`→ t`の形式で表現する
12
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
118 再帰呼び出しは使わない(構文的には禁止していないので注意が必要)
8
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
119 ```
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
120 {-# TERMINATING #-}
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
121 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
122 whileLoop env next with lt 0 (varn env)
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
123 whileLoop env next | false = next env
edabf6c6885d WIP slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 7
diff changeset
124 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
125 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
126 - t を返すことで継続を表す(tは呼び出し時に任意に指定してもよい. testに使える)
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
127 - tail call により light weight continuation を定義している
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
128
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 # Gears Agda と Gears CbC の対応
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
131 Gears Agda
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
132 - 証明向きの記述
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
133 - Hoare Condition を含む
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
134
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
135 Gears CbC
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
136 - 実行向きの記述
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 Context
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
140 - processに相当する
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
141 - Code Gear 単位で並列実行
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
142
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
143
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
144 # Normal level と Meta Level を用いた信頼性の向上
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
145 Normal Level
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
146 - 軽量継続
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
147 - Code Gear 単位で関数型プログラミングとなる
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
148 - atomic(Code Gear 自体の実行は割り込まれない)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
149 - ポインタの操作は含まれない
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 Meta Level
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
152 - メモリやCPUなどの資源管理, ポインタ操作
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
153 - Hoare Condition と証明
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
154 - Contextによる並列実行
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
155 - monadに相当するData構造
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
156
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 <!-- class: fig_cg -->
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
159 ![height:700px](meta_cg_dg.svg)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
160
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
161 # Gears Agda と Hoare Logic
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
162 <!-- class: slide -->
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
163 C.A.R Hoare, R.W Floyd が考案
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
164 - Pre Condition → Command → Post Condition
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
165
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
166 Gears Agda による Command の例
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
167 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
168 {-# TERMINATING #-}
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
169 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
170 whileLoop env next with lt 0 (varn env)
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
171 whileLoop env next | false = next env
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
172 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
173 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
174 - `{-# TERMINATING #-}`
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
175 - with 文
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
176
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
177 # Gears Agda の Pre Condition Post Condition
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 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
180 → (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
181 → (exit : (e1 : Env )→ vari e1 ≡ c10 → t) → t
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
182 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
183 - Terminatingを避けるためにloopを分割
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
184 - `varn env + vari env ≡ c10` が Pre Condition
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
185 - `varn e1 + vari e1 ≡ c10` が Post Condition
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
186 - `varn e1 < varn env → t` が停止を保証する減少列
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
187
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
188 これは命題なので証明を与えてPre ConditionからPost Conditionを導出する必要がある
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
189 証明は値として次のCodeGearに渡される
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
190
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
191 # Loop の接続
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
192 分割したloopを接続するMeta Code Gearを作成する
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
193 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
194 TerminatingLoopS : {l : Level} {t : Set l} ( Index : Set )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
195 → {Invraiant : Index → Set } → ( reduce : Index → N)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
196 → (loop : (r : Index) → Invraiant r
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
197 → (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
198 → (r : Index) → (p : Invraiant r) → t
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
199 ```
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
200 - IndexはLoop変数
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
201 - Invariantはloop変数の不変条件
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
202 - loopに接続するCode Gearを与える
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
203 - reduceは停止性を保証する減少列
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
204
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
205 これを一般的に証明することができている
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
206
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
207 # 実際のloopの接続
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
208 証明したい性質を以下のように記述する
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
209 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
210 whileTestSpec1 : (c10 : N) → (e1 : Env ) → vari e1 ≡ c10 → ⊤
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
211 whileTestSpec1 _ _ x = tt
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
212 ```
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
213 loopをTerminatingLoopSで接続して仕様記述に繋げる
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 proofGearsTermS : {c10 : N} → ⊤
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
216 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
217 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
218 (λ ne pe → whileTestSpec1 c10 ne pe)) n1 p1 ))
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
219 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
220 - conversion1はPre Condition をPost Conditionに変換する
10
60d4617eac84 fix slide intro
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 9
diff changeset
221 - ⊤
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
222
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
223 # test との違い
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
224 - test では実数を与えた際の出力が仕様に沿ったものであるかを検証する
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 - 今回の定理証明を用いた証明では実数を必要としない
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
227 - そのため、入力の型の範囲全てに対して仕様を満たしているか検証できる
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 # Gears Agda による BinaryTree の実装
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
231 CbCと並行した実装をするため、Stackを明示した実装をする
9
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 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
234 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
235 → (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
236 find key leaf st _ exit = exit leaf st
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
237 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
238 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
239 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
240 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
241 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
242 置き換えるnodeまでTreeを辿り、Stackに逆順にTreeを積んでいく
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
243
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
244 <!--
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
245 findは全部書いても大丈夫そう
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 # Gears Agda による BinaryTree の実装 replace node
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
249 置き換えたnodeをStackを解消しながらTreeを再構成する
9
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 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
252 → (key : N) → (value : A) → bt A → List (bt A)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
253 → (next : N → A → bt A → List (bt A) → t )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
254 → (exit : bt A → t) → t
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
255 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
256 replace key value repl (leaf ∷ []) next exit = exit repl
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
257 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
258 ... | 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
259 ... | 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
260 ... | 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
261 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
262 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
263 ... | 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
264 ... | 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
265 ... | 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
266 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
267
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268
9
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 これは途中省略してよさそう
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
271 -->
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
272
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
273 # Binary Tree の3種類の Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
274 Tree Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
275 - Binary Tree が Key の順序に沿って構成されていることを表すData構造
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
276
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
277 Stack Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
278 - Stackが木の昇順に構成されていることを表す
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 Replace Tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
281 - 2つの木の1つのnodeが入れ替わっていることを示す
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 # Tree Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
284 - Invariant というよりも可能な Binary Tree 全体の集合を表す型
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
285 - 制約付きのBinary Tree
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
286 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
287 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
288 t-leaf : treeInvariant leaf
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
289 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
290 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
291 → treeInvariant (node key₁ value₁ t₁ t₂)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
292 → 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
293 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
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₁ (node key value t₁ t₂) leaf )
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
296 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
297 → {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
298 → treeInvariant (node key value t₁ t₂)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
299 → treeInvariant (node key₂ value₂ t₃ t₄)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
300 → 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
301 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
302
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
303 <!--
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
304 t-leaf はコンストラクタ
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
305
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
306
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
307 コードの解説
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
308 省略した方がたぶん絶対良い
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
309 right と left なんかはほとんど対照的なので省略とかでよさそう
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
310 あとは、木構造の仕様を満たすためにData型になっている説明があるとよさそう
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
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
313
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
314 # Stack Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
315 - StackにはTreeを辿った履歴が残っている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
316 - 辿り方はKeyの値に依存する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
317 - 実際のStackよりも豊富な情報を持っている<!--Keyの比較が入っているから-->
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
318
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
319 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
320 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
321 → (stack : List (bt A)) → Set n where
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
322 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
323 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
324 → 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
325 → stackInvariant key tree tree0 (tree ∷ st)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
326 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
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 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
330
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
331 # Replace Tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
332 - 木の特定のnodeが正しく置き換えられているか
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
333 ```
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
334 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
335 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
336 r-node : {value₁ : A} → {t t₁ : bt A}
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
337 → 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
338 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
339 → k < key → replacedTree key value t2 t
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
340 → 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
341 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
342 → key < k → replacedTree key value t1 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 t t2)
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
344 ```
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
346 # find の Hoare Condition
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
347 findPでは treeInvariant をつかって stackInvariant を生成する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
348 停止性を証明する木の深さの不等式も証明する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
349 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
350 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
351 → treeInvariant tree ∧ stackInvariant key tree tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
352 → (next : (tree1 : bt A) → (stack : List (bt A))
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
353 → treeInvariant tree1 ∧ stackInvariant key tree1 tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
354 → bt-depth tree1 < bt-depth tree → t )
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
355 → (exit : (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 → (tree1 ≡ leaf ) ∨ ( node-key tree1 ≡ just key ) → t ) → t
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
358 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
359
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
360 # Hoare Condition の拡張
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
361 testなどでは仮定が入ることがある
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
362 Hoare Conditionを拡張可能な部分があるrecordで定義する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
363 Cが拡張される部分で, これはDataの継続に相当する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
364 Code Gear に継続があるように Data Gearにも継続がある
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
365 ```
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
366 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
367 (C : ℕ → bt A → List (bt A) → Set n) : Set n where
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
368 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
369 tree0 : bt A
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
370 ti0 : treeInvariant tree0
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
371 ti : treeInvariant tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
372 si : stackInvariant key tree tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
373 ci : C key tree stack -- data continuation
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
374 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
375
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
376 # 拡張部分の記述と推論
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
377 拡張部分はrecord findPC で定義する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
378 拡張部分の推論はrecord findExt で定義する
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 {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
381 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
382 tree1 : bt A
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
383 ci : replacedTree key1 value tree1 tree
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
384
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
385 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
386 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
387 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
388 → 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
389 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
390 → 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
391 ```
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
392
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
393 # replade Node の Invariant
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
394 repraceTree は置き換えるべきnodeが実行時に決まるので関数を挟んだInvariantになる
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
395 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
396 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
397 child-replaced key leaf = leaf
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
398 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
399 ... | tri< a ¬b ¬c = left
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
400 ... | tri≈ ¬a b ¬c = node key₁ value left right
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
401 ... | tri> ¬a ¬b c = right
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
402
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
403 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
404 (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
405 field
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
406 tree0 : bt A
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
407 ti : treeInvariant tree0
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
408 si : stackInvariant key tree tree0 stack
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
409 ri : replacedTree key value (child-replaced key tree ) repl
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
410 ci : C tree repl stack -- data continuation
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
411 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
412
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
413 # 最終的な証明コード
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
414 insertしたkeyをfindすると元の値が取れてくることを証明する
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
415 insertTreeSpec0が仕様
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
416 conteinsTreeがtestコードかつ証明になっている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
417 証明の詳細はコードのHoara condition の証明に入っている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
418 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
419 insertTreeSpec0 : {n : Level} {A : Set n} → (tree : bt A) → (value : A)
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
420 → top-value tree ≡ just value → ⊤
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
421 insertTreeSpec0 _ _ _ = tt
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
422
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
423 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
424 → treeInvariant tree1 → replacedTree key value tree1 tree → ⊤
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
425 containsTree {n} {A} tree tree1 key value P RT =
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
426 TerminatingLoopS (bt A ∧ List (bt A) )
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
427 {λ 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
428 ⟪ tree , tree ∷ [] ⟫ ?
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
429 $ λ 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
430 $ λ 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
431 ```
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
432
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
433 # replace Tree の性質
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
434 Replace Tree 自体は Tree に特定の値が入っていることを示すData構造になっている
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
435 これをHoare条件として持ち歩くことにより、Binary Treeの詳細に立ち入らず何が入っているかを指定できる
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
436
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
437 これにより木を用いるプログラムでの証明を記述できる
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
438 insert Tree や Find Node の停止性も証明されている
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
439
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 # 今後の研究方針
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
441 - Deleteの実装
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
442 - Red Black Tree の実装
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
443 - 今回定義した条件はそのまま Red Black Tree の検証に使用できるはず
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
444 - Contextを用いた並列実行時のプログラムの正しさの証明
12
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
445 - synchronized queue
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
446 - concurrent tree
11
8a97e69f8615 いったんスライドは完成
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 10
diff changeset
447 - xv.6への適用
9
e02e29a614c9 add mindmap
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 8
diff changeset
448 - モデル検査
7
c563ad7f60cd WIP スライドを追加
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
449
12
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
450 読めない間は待っている
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
451 tree
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
452
7
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 を検証することができた
12
62e56d73f104 WIP カンペを追加 14ページまで
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
455 - Gears Agda における Termination を使用しない実装の仕方を確立した
7
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 <!-- 英語版も欲しい-->