comparison whileTestGears.agda @ 56:34601fe34b71

fix
author ryokka
date Sat, 21 Dec 2019 15:47:30 +0900
parents 1be7bb658cf0
children 990d1d892398
comparison
equal deleted inserted replaced
55:1be7bb658cf0 56:34601fe34b71
141 whileTestPwP : {l : Level} {t : Set l} → (c10 : ℕ) → ((env : Envc ) → whileTestStateP s1 env → t) → t 141 whileTestPwP : {l : Level} {t : Set l} → (c10 : ℕ) → ((env : Envc ) → whileTestStateP s1 env → t) → t
142 whileTestPwP c10 next = next env record { pi1 = refl ; pi2 = refl } where 142 whileTestPwP c10 next = next env record { pi1 = refl ; pi2 = refl } where
143 env : Envc 143 env : Envc
144 env = whileTestP c10 ( λ env → env ) 144 env = whileTestP c10 ( λ env → env )
145 145
146 whileLoopPwP : {l : Level} {t : Set l} → (env : Envc ) → whileTestStateP s2 env 146 whileLoopPwP : {l : Level} {t : Set l} → (env : Envc ) → whileTestStateP s2 env
147 → (next : (env : Envc ) → whileTestStateP s2 env → t) 147 → (next : (env : Envc ) → whileTestStateP s2 env → t)
148 → (exit : (env : Envc ) → whileTestStateP sf env → t) → t 148 → (exit : (env : Envc ) → whileTestStateP sf env → t) → t
149 whileLoopPwP env s next exit with <-cmp 0 (varn env) 149 whileLoopPwP env s next exit with <-cmp 0 (varn env)
150 whileLoopPwP env s next exit | tri≈ ¬a b ¬c = exit env (lem (sym b) s) 150 whileLoopPwP env s next exit | tri≈ ¬a b ¬c = exit env (lem (sym b) s)
151 where 151 where
152 lem : (varn env ≡ 0) → (varn env + vari env ≡ c10 env) → vari env ≡ c10 env 152 lem : (varn env ≡ 0) → (varn env + vari env ≡ c10 env) → vari env ≡ c10 env
153 lem p1 p2 rewrite p1 = p2 153 lem p1 p2 rewrite p1 = p2
154 154
155 whileLoopPwP env s next exit | tri< a ¬b ¬c = 155 whileLoopPwP env s next exit | tri< a ¬b ¬c = next (record env {varn = (varn env) - 1 ; vari = (vari env) + 1 }) (proof5 a)
156 next (record env {varn = (varn env) - 1 ; vari = (vari env) + 1 }) {!!} 156 where
157 1<0 : 1 ≤ zero → ⊥
158 1<0 ()
159 proof5 : (suc zero ≤ (varn env)) → (varn env - 1) + (vari env + 1) ≡ c10 env
160 proof5 (s≤s lt) with varn env
161 proof5 (s≤s z≤n) | zero = ⊥-elim (1<0 a)
162 proof5 (s≤s (z≤n {n'}) ) | suc n = let open ≡-Reasoning in
163 begin
164 n' + (vari env + 1)
165 ≡⟨ cong ( λ z → n' + z ) ( +-sym {vari env} {1} ) ⟩
166 n' + (1 + vari env )
167 ≡⟨ sym ( +-assoc (n') 1 (vari env) ) ⟩
168 (n' + 1) + vari env
169 ≡⟨ cong ( λ z → z + vari env ) +1≡suc ⟩
170 (suc n' ) + vari env
171 ≡⟨⟩
172 varn env + vari env
173 ≡⟨ s ⟩
174 c10 env
175
157 176
158 {-# TERMINATING #-} 177 {-# TERMINATING #-}
159 loopPwP : {l : Level} {t : Set l} → (env : Envc ) → whileTestStateP s2 env → (exit : (env : Envc ) → whileTestStateP sf env → t) → t 178 loopPwP : {l : Level} {t : Set l} → (env : Envc ) → whileTestStateP s2 env → (exit : (env : Envc ) → whileTestStateP sf env → t) → t
160 loopPwP env s exit = whileLoopPwP env s (λ env s → loopPwP env s exit ) exit 179 loopPwP env s exit = whileLoopPwP env s (λ env s → loopPwP env s exit ) exit
161 180
163 whileTestPCallwP c = whileTestPwP {_} {_} c ( λ env s → loopPwP env (conv env s) ( λ env s → vari env ≡ c ) ) where 182 whileTestPCallwP c = whileTestPwP {_} {_} c ( λ env s → loopPwP env (conv env s) ( λ env s → vari env ≡ c ) ) where
164 conv : (env : Envc ) → (vari env ≡ 0) /\ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env 183 conv : (env : Envc ) → (vari env ≡ 0) /\ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env
165 conv e record { pi1 = refl ; pi2 = refl } = +zero 184 conv e record { pi1 = refl ; pi2 = refl } = +zero
166 185
167 Proof : (c : ℕ ) → whileTestPCallwP c 186 Proof : (c : ℕ ) → whileTestPCallwP c
168 Proof c = whileTestPwP {_} {_} c ( λ env s → loopPwP env (conv env s) ( λ env s → {!!} ) ) where 187 Proof zero = whileTestPwP {_} {_} zero (λ env s → loopPwP env (conv env s) (λ env s → refl))
188 where
169 conv : (env : Envc ) → (vari env ≡ 0) /\ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env 189 conv : (env : Envc ) → (vari env ≡ 0) /\ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env
170 conv e record { pi1 = refl ; pi2 = refl } = +zero 190 conv e record { pi1 = refl ; pi2 = refl } = +zero
171 191 Proof (suc c) = whileTestPwP {_} {_} zero (λ env s → loopPwP env (conv env s) (λ env s → {!!})) -- Proof c したいが with <-cmp 0 c とか with 0 ≤ c とかするとAgda の check が終わらない
172 192 where
173 193 conv : (env : Envc ) → (vari env ≡ 0) /\ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env
174 194 conv e record { pi1 = refl ; pi2 = refl } = +zero
175