Skip to content

Commit 83d6dcf

Browse files
Prove classic-amortization theorem for Simple
1 parent ccc95da commit 83d6dcf

File tree

1 file changed

+36
-13
lines changed

1 file changed

+36
-13
lines changed

src/Examples/Amortized.agda

+36-13
Original file line numberDiff line numberDiff line change
@@ -35,26 +35,31 @@ variable
3535
_⋉_ : tp pos tp neg tp neg
3636
A ⋉ X = Σ+- A (const X)
3737

38+
infix 3 _⇒_ _⇔_
39+
_⇒_ _⇔_ : tp neg tp neg tp neg
40+
X ⇒ Y = Π (U X) λ _ Y
41+
X ⇔ Y = prod⁻ (X ⇒ Y) (Y ⇒ X)
42+
3843

3944
module Simple where
4045
postulate
4146
simple : tp neg
4247
record Simple : Set where
4348
coinductive
4449
field
45-
here : cmp (F unit)
50+
quit : cmp (F unit)
4651
next : cmp simple
4752
postulate
4853
simple/decode : val (U simple) ≡ Simple
4954
{-# REWRITE simple/decode #-}
5055

51-
here/step : {c e} Simple.here (step simple c e) ≡ step (F unit) c (Simple.here e)
56+
quit/step : {c e} Simple.quit (step simple c e) ≡ step (F unit) c (Simple.quit e)
5257
next/step : {c e} Simple.next (step simple c e) ≡ step simple c (Simple.next e)
53-
{-# REWRITE here/step next/step #-}
58+
{-# REWRITE quit/step next/step #-}
5459

5560
{-# TERMINATING #-}
5661
every : cmp simple
57-
Simple.here every = ret triv
62+
Simple.quit every = ret triv
5863
Simple.next every = step simple 1 every
5964

6065
Φ : val bool
@@ -63,26 +68,49 @@ module Simple where
6368

6469
{-# TERMINATING #-}
6570
alternating : cmp (Π bool λ _ simple)
66-
Simple.here (alternating b) = step (F unit) (Φ b) (ret triv)
71+
Simple.quit (alternating b) = step (F unit) (Φ b) (ret triv)
6772
Simple.next (alternating false) = step simple 2 (alternating true)
6873
Simple.next (alternating true ) = alternating false
6974

7075
record _≈_ (s₁ s₂ : cmp simple) : Set where
7176
coinductive
7277
field
73-
here : Simple.here s₁ ≡ Simple.here s₂
78+
quit : Simple.quit s₁ ≡ Simple.quit s₂
7479
next : Simple.next s₁ ≈ Simple.next s₂
7580

7681
≈-cong : (c : cmp cost) {x y : Simple} x ≈ y step simple c x ≈ step simple c y
77-
_≈_.here (≈-cong c h) = Eq.cong (step (F unit) c) (_≈_.here h)
82+
_≈_.quit (≈-cong c h) = Eq.cong (step (F unit) c) (_≈_.quit h)
7883
_≈_.next (≈-cong c h) = ≈-cong c (_≈_.next h)
7984

8085
{-# TERMINATING #-}
8186
every≈alternating : b alternating b ≈ step simple (Φ b) every
82-
_≈_.here (every≈alternating _) = refl
87+
_≈_.quit (every≈alternating _) = refl
8388
_≈_.next (every≈alternating false) = ≈-cong 2 (every≈alternating true)
8489
_≈_.next (every≈alternating true ) = every≈alternating false
8590

91+
simple-program : tp pos
92+
simple-program = nat
93+
94+
{-# TERMINATING #-}
95+
ψ : cmp (Π simple-program λ _ Π (U simple) λ _ F unit)
96+
ψ zero s = Simple.quit s
97+
ψ (suc n) s = ψ n (Simple.next s)
98+
99+
_≈'_ : (q₁ q₂ : cmp simple) Set
100+
s₁ ≈' s₂ = cmp (Π simple-program λ p meta (ψ p s₁ ≡ ψ p s₂))
101+
102+
{-# TERMINATING #-}
103+
classic-amortization : {s₁ s₂ : cmp simple} cmp (meta (s₁ ≈ s₂) ⇔ meta (s₁ ≈' s₂))
104+
classic-amortization = forward , backward
105+
where
106+
forward : {s₁ s₂ : cmp simple} s₁ ≈ s₂ s₁ ≈' s₂
107+
forward h zero = _≈_.quit h
108+
forward h (suc n) = forward (_≈_.next h) n
109+
110+
backward : {s₁ s₂ : cmp simple} s₁ ≈' s₂ s₁ ≈ s₂
111+
_≈_.quit (backward classic) = classic zero
112+
_≈_.next (backward classic) = backward (λ n classic (suc n))
113+
86114

87115
module Queue where
88116
-- moving `E` to a parameter on `module Queue` breaks things - Agda bug?
@@ -272,11 +300,6 @@ module Queue where
272300
_≈'_ : (q₁ q₂ : cmp (queue X)) Set
273301
q₁ ≈' q₂ = (A : tp pos) cmp (Π (queue-program A) λ p meta (ψ p q₁ ≡ ψ p q₂))
274302

275-
infix 3 _⇒_ _⇔_
276-
_⇒_ _⇔_ : tp neg tp neg tp neg
277-
X ⇒ Y = Π (U X) λ _ Y
278-
X ⇔ Y = prod⁻ (X ⇒ Y) (Y ⇒ X)
279-
280303
{-# TERMINATING #-}
281304
classic-amortization : {q₁ q₂ : cmp (queue X)} cmp (meta (q₁ ≈ q₂) ⇔ meta (q₁ ≈' q₂))
282305
classic-amortization {X} = forward , backward

0 commit comments

Comments
 (0)