@@ -35,26 +35,31 @@ variable
35
35
_⋉_ : tp pos → tp neg → tp neg
36
36
A ⋉ X = Σ+- A (const X)
37
37
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
+
38
43
39
44
module Simple where
40
45
postulate
41
46
simple : tp neg
42
47
record Simple : Set where
43
48
coinductive
44
49
field
45
- here : cmp (F unit)
50
+ quit : cmp (F unit)
46
51
next : cmp simple
47
52
postulate
48
53
simple/decode : val (U simple) ≡ Simple
49
54
{-# REWRITE simple/decode #-}
50
55
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)
52
57
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 #-}
54
59
55
60
{-# TERMINATING #-}
56
61
every : cmp simple
57
- Simple.here every = ret triv
62
+ Simple.quit every = ret triv
58
63
Simple.next every = step simple 1 every
59
64
60
65
Φ : val bool → ℂ
@@ -63,26 +68,49 @@ module Simple where
63
68
64
69
{-# TERMINATING #-}
65
70
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)
67
72
Simple.next (alternating false) = step simple 2 (alternating true)
68
73
Simple.next (alternating true ) = alternating false
69
74
70
75
record _≈_ (s₁ s₂ : cmp simple) : Set where
71
76
coinductive
72
77
field
73
- here : Simple.here s₁ ≡ Simple.here s₂
78
+ quit : Simple.quit s₁ ≡ Simple.quit s₂
74
79
next : Simple.next s₁ ≈ Simple.next s₂
75
80
76
81
≈-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)
78
83
_≈_.next (≈-cong c h) = ≈-cong c (_≈_.next h)
79
84
80
85
{-# TERMINATING #-}
81
86
every≈alternating : ∀ b → alternating b ≈ step simple (Φ b) every
82
- _≈_.here (every≈alternating _) = refl
87
+ _≈_.quit (every≈alternating _) = refl
83
88
_≈_.next (every≈alternating false) = ≈-cong 2 (every≈alternating true)
84
89
_≈_.next (every≈alternating true ) = every≈alternating false
85
90
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
+
86
114
87
115
module Queue where
88
116
-- moving `E` to a parameter on `module Queue` breaks things - Agda bug?
@@ -272,11 +300,6 @@ module Queue where
272
300
_≈'_ : (q₁ q₂ : cmp (queue X)) → Set
273
301
q₁ ≈' q₂ = (A : tp pos) → cmp (Π (queue-program A) λ p → meta (ψ p q₁ ≡ ψ p q₂))
274
302
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
-
280
303
{-# TERMINATING #-}
281
304
classic-amortization : {q₁ q₂ : cmp (queue X)} → cmp (meta (q₁ ≈ q₂) ⇔ meta (q₁ ≈' q₂))
282
305
classic-amortization {X} = forward , backward
0 commit comments