Skip to content

Commit 1e7d169

Browse files
committed
agda: complete CNO composition proof and fix modulo parsing
1 parent 24fae59 commit 1e7d169

1 file changed

Lines changed: 19 additions & 10 deletions

File tree

absolute-zero/proofs/agda/CNO.agda

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,20 @@
1010

1111
module CNO where
1212

13-
open import Data.Nat using (ℕ; zero; suc; _+_; _*_)
13+
open import Data.Nat using (ℕ; zero; suc; _+_; _*_; nonZero)
14+
open import Data.Nat.Base using (NonZero)
15+
open import Data.Nat.DivMod using (_%_)
1416
open import Data.List using (List; []; _∷_; _++_; length)
1517
open import Data.Product using (_×_; _,_; proj₁; proj₂; Σ; ∃)
1618
open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; trans; cong)
1719
open import Data.Bool using (Bool; true; false; if_then_else_)
1820
open import Data.Maybe using (Maybe; just; nothing)
1921
open import Function using (_∘_; id)
2022

23+
instance
24+
nonZero3 : NonZero 3
25+
nonZero3 = nonZero
26+
2127
----------------------------------------------------------------------------
2228
-- Memory Model
2329
----------------------------------------------------------------------------
@@ -293,15 +299,23 @@ state-eq-trans (m₁ , r₁ , i₁ , p₁) (m₂ , r₂ , i₂ , p₂) =
293299
trans i₁ i₂ ,
294300
trans p₁ p₂
295301

302+
state-eq-cong-left : {s₁ s₂ s₃} s₁ ≡ s₂ state-eq s₂ s₃ state-eq s₁ s₃
303+
state-eq-cong-left refl eq = eq
304+
296305
-- Composition of CNOs is a CNO
297306
cno-composition : {p₁ p₂} IsCNO p₁ IsCNO p₂ IsCNO (seq-comp p₁ p₂)
298307
cno-composition {p₁} {p₂} cno₁ cno₂ = record
299308
{ cno-terminates = λ s terminates-always (seq-comp p₁ p₂) s
300309
; cno-identity = λ s
301310
let eq₁ = IsCNO.cno-identity cno₁ s
302311
eq₂ = IsCNO.cno-identity cno₂ (eval p₁ s)
303-
in {!!} -- Requires more work with rewrite
304-
; cno-pure = λ s {!!}
312+
in state-eq-cong-left (eval-seq-comp p₁ p₂ s) (state-eq-trans eq₂ eq₁)
313+
; cno-pure = λ s
314+
let eq₁ = IsCNO.cno-identity cno₁ s
315+
eq₂ = IsCNO.cno-identity cno₂ (eval p₁ s)
316+
eq = state-eq-cong-left (eval-seq-comp p₁ p₂ s) (state-eq-trans eq₂ eq₁)
317+
(m , _ , i , _) = eq
318+
in sym i , (λ addr sym (m addr))
305319
; cno-reversible = λ s refl
306320
}
307321

@@ -311,16 +325,11 @@ cno-composition {p₁} {p₂} cno₁ cno₂ = record
311325

312326
-- Ternary operations
313327
ternary-add :
314-
ternary-add a b = (a + b) Data.Nat.% 3
315-
where
316-
open import Data.Nat.DivMod using (_Data.Nat.%_)
317-
-- Simplified for demonstration
328+
ternary-add a b = (a + b) % 3
318329

319330
-- Crazy operation
320331
crazy-op :
321-
crazy-op a b = (a + b) Data.Nat.% 3
322-
where
323-
open import Data.Nat.DivMod using (_Data.Nat.%_)
332+
crazy-op a b = (a + b) % 3
324333

325334
----------------------------------------------------------------------------
326335
-- Absolute Zero

0 commit comments

Comments
 (0)