comparison whileTestPrim.agda @ 3:6be8ee856666

add simple Hoare logic example
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 14 Dec 2018 16:26:49 +0900
parents
children 64bd5c236002
comparison
equal deleted inserted replaced
2:b05a4156da01 3:6be8ee856666
1 module whileTestPrim where
2
3 open import Function
4 open import Data.Nat
5 open import Data.Bool hiding ( _≟_ )
6 open import Level renaming ( suc to succ ; zero to Zero )
7 open import Relation.Nullary using (¬_; Dec; yes; no)
8 open import Relation.Binary.Core
9
10
11
12 record Env : Set where
13 field
14 varn : ℕ
15 vari : ℕ
16 open Env
17
18 PrimComm : Set
19 PrimComm = Env → Env
20
21 Cond : Set
22 Cond = (Env → Bool)
23
24 data Comm : Set where
25 Skip : Comm
26 Abort : Comm
27 PComm : PrimComm -> Comm
28 Seq : Comm -> Comm -> Comm
29 If : Cond -> Comm -> Comm -> Comm
30 While : Cond -> Comm -> Comm
31
32 _-_ : ℕ -> ℕ -> ℕ
33 x - zero = x
34 zero - _ = zero
35 (suc x) - (suc y) = x - y
36
37 lt : ℕ -> ℕ -> Bool
38 lt x y with (suc x ) ≤? y
39 lt x y | yes p = true
40 lt x y | no ¬p = false
41
42 Equal : ℕ -> ℕ -> Bool
43 Equal x y with x ≟ y
44 Equal x y | yes p = true
45 Equal x y | no ¬p = false
46
47 program : Comm
48 program =
49 Seq ( PComm (λ env → record env {varn = 10}))
50 $ Seq ( PComm (λ env → record env {vari = 0}))
51 $ While (λ env → lt (varn env ) zero )
52 (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} ))
53 $ PComm (λ env → record env {varn = ((varn env) - 1)} ))
54
55 simple : Comm
56 simple =
57 Seq ( PComm (λ env → record env {varn = 10}))
58 $ PComm (λ env → record env {vari = 0})
59
60 {-# TERMINATING #-}
61 interpret : Env → Comm → Env
62 interpret env Skip = env
63 interpret env Abort = env
64 interpret env (PComm x) = x env
65 interpret env (Seq comm comm1) = interpret (interpret env comm) comm1
66 interpret env (If x then else) with x env
67 ... | true = interpret env then
68 ... | false = interpret env else
69 interpret env (While x comm) with x env
70 ... | true = interpret (interpret env comm) (While x comm)
71 ... | false = env
72
73 test1 : Env
74 test1 = interpret ( record { vari = 0 ; varn = 0 } ) program
75
76
77 empty-case : (env : Env) → (( λ e → true ) env ) ≡ true
78 empty-case _ = refl
79
80 implies : Bool → Bool → Bool
81 implies false _ = true
82 implies true true = true
83 implies true false = false
84
85 Axiom : Cond -> PrimComm -> Cond -> Set
86 Axiom pre comm post = ∀ (env : Env) → implies (pre env) ( post (comm env)) ≡ true
87
88 Tautology : Cond -> Cond -> Set
89 Tautology pre post = ∀ (env : Env) → implies (pre env) (post env) ≡ true
90
91 _/\_ : Cond -> Cond -> Cond
92 x /\ y = λ env → x env ∧ y env
93
94 neg : Cond -> Cond
95 neg x = λ env → not ( x env )
96
97 data HTProof : Cond -> Comm -> Cond -> Set where
98 PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} ->
99 (pr : Axiom bPre pcm bPost) ->
100 HTProof bPre (PComm pcm) bPost
101 SkipRule : (b : Cond) -> HTProof b Skip b
102 AbortRule : (bPre : Cond) -> (bPost : Cond) ->
103 HTProof bPre Abort bPost
104 WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} ->
105 {bPost' : Cond} -> {bPost : Cond} ->
106 Tautology bPre bPre' ->
107 HTProof bPre' cm bPost' ->
108 Tautology bPost' bPost ->
109 HTProof bPre cm bPost
110 SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} ->
111 {cm2 : Comm} -> {bPost : Cond} ->
112 HTProof bPre cm1 bMid ->
113 HTProof bMid cm2 bPost ->
114 HTProof bPre (Seq cm1 cm2) bPost
115 IfRule : {cmThen : Comm} -> {cmElse : Comm} ->
116 {bPre : Cond} -> {bPost : Cond} ->
117 {b : Cond} ->
118 HTProof (bPre /\ b) cmThen bPost ->
119 HTProof (bPre /\ neg b) cmElse bPost ->
120 HTProof bPre (If b cmThen cmElse) bPost
121 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} ->
122 HTProof (bInv /\ b) cm bInv ->
123 HTProof bInv (While b cm) (bInv /\ neg b)
124
125 initCond : Cond
126 initCond env = true
127
128 stmt1Cond : Cond
129 stmt1Cond env = Equal (varn env) 10
130
131 stmt2Cond : Cond
132 stmt2Cond env = (Equal (varn env) 10) ∧ (Equal (vari env) 0)
133
134 whileInv : Cond
135 whileInv env = Equal ((varn env) + (vari env)) 10
136
137 whileInv' : Cond
138 whileInv' env = Equal ((varn env) + (vari env)) 11
139
140 termCond : Cond
141 termCond env = Equal (vari env) 10
142
143 eqlemma : { x y : ℕ } → Equal x y ≡ true → x ≡ y
144 eqlemma {x} {y} eq with x ≟ y
145 eqlemma {x} {y} refl | yes refl = refl
146 eqlemma {x} {y} () | no ¬p
147
148 proofs : HTProof initCond simple stmt2Cond
149 proofs =
150 SeqRule {initCond} ( PrimRule empty-case )
151 $ PrimRule {stmt1Cond} {_} {stmt2Cond} lemma
152 where
153 lemma : Axiom stmt1Cond (λ env → record { varn = varn env ; vari = 0 }) stmt2Cond
154 lemma env with stmt1Cond env
155 lemma env | false = refl
156 lemma env | true = refl
157
158
159 proof1 : HTProof initCond program termCond
160 proof1 =
161 SeqRule {λ e → true} ( PrimRule empty-case )
162 $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 )
163 $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 (
164 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10}
165 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt (varn e) zero } lemma3)
166 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5
167 where
168 lemma1 : Axiom stmt1Cond (λ env → record { varn = varn env ; vari = 0 }) stmt2Cond
169 lemma1 env with stmt1Cond env
170 lemma1 env | false = refl
171 lemma1 env | true = refl
172 lemma2 : Tautology stmt2Cond whileInv
173 lemma2 env with stmt2Cond env | Equal (varn env + vari env) 10
174 lemma2 env | false | false = refl
175 lemma2 env | false | true = refl
176 lemma2 env | true | true = refl
177 lemma2 env | true | false = {!!}
178 lemma3 : Axiom (whileInv /\ (λ env → lt (varn env) zero)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv'
179 lemma3 = {!!}
180 lemma4 : Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv
181 lemma4 = {!!}
182 lemma5 : Tautology (whileInv /\ neg (λ z → lt (varn z) zero)) termCond
183 lemma5 = {!!}
184
185