1010
1111module 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 (_%_)
1416open import Data.List using (List; []; _∷_; _++_; length)
1517open import Data.Product using (_×_; _,_; proj₁; proj₂; Σ; ∃)
1618open import Relation.Binary.PropositionalEquality using (_≡_; refl; sym; trans; cong)
1719open import Data.Bool using (Bool; true; false; if_then_else_)
1820open import Data.Maybe using (Maybe; just; nothing)
1921open 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
297306cno-composition : ∀ {p₁ p₂} → IsCNO p₁ → IsCNO p₂ → IsCNO (seq-comp p₁ p₂)
298307cno-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
313327ternary-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
320331crazy-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