@@ -14,8 +14,6 @@ module _ where
14
14
contr : {A : Prop } {x y : ⟦ A ⟧} -> x ≡ y
15
15
contr = trustMe
16
16
17
- -- We could compare functions with a finite domain for equality,
18
- -- but then equality can't be `_≡_`.
19
17
SemEq : ∀ {i a} {ι : Level i} {α : Level a} {I : Type ι} -> Desc I α -> Set
20
18
SemEq (var i) = ⊤
21
19
SemEq (π A D) = ⊥
@@ -71,6 +69,59 @@ mutual
71
69
_≟_ {A = desc I α} {{()}}
72
70
_≟_ {A = imu D j } d₁ d₂ = decMu d₁ d₂
73
71
72
+ coerceFamEnum : ∀ {n} {e f : Apply Enum n} -> (A : Apply Enum n -> Set ) -> ⟦ e ≅ f ⟧ -> A e -> A f
73
+ coerceFamEnum {0 } {tag () } {tag () } A q x
74
+ coerceFamEnum {1 } {tag tt } {tag tt } A q x = x
75
+ coerceFamEnum {suc (suc n)} {tag nothing } {tag nothing } A q x = x
76
+ coerceFamEnum {suc (suc n)} {tag (just _)} {tag (just _)} A q x =
77
+ coerceFamEnum (A ∘ tag ∘ just ∘ detag) q x
78
+ coerceFamEnum {suc (suc n)} {tag nothing } {tag (just _)} A () x
79
+ coerceFamEnum {suc (suc n)} {tag (just _)} {tag nothing } A () x
80
+
81
+ mutual
82
+ observeSem : ∀ {i a} {ι : Level i} {α : Level a}
83
+ {I : Type ι} {E : Desc I α} {{eqE : ExtendEq E}}
84
+ -> (D : Desc I α) {{edD : SemEq D}}
85
+ -> (d₁ d₂ : ⟦ D ⟧ᵈ (μ E)) -> ⟦ D , d₁ ≅s D , d₂ ⟧ -> d₁ ≡ d₂
86
+ observeSem (var i) d₁ d₂ q = observe q
87
+ observeSem (π A D) {{()}} d₁ d₂ q
88
+ observeSem (D ⊛ E) {{eqD , eqE}} (d₁ , e₁) (d₂ , e₂) (qd , qe) =
89
+ pcong₂ _,_ (observeSem D {{eqD}} d₁ d₂ qd) (observeSem E {{eqE}} e₁ e₂ qe)
90
+
91
+ observeExtend : ∀ {i a} {ι : Level i} {α : Level a} {I : Type ι}
92
+ {E : Desc I α} {j} {{edE : ExtendEq E}}
93
+ -> (D : Desc I α) {{edD : ExtendEq D}}
94
+ -> (e₁ e₂ : Extend D (μ E) j) -> ⟦ D , e₁ ≅e D , e₂ ⟧ -> e₁ ≡ e₂
95
+ observeExtend (var i) q₁ q₂ q = contr
96
+ observeExtend (π A D) {{eqA , eqD}} (x₁ , e₁) (x₂ , e₂) (qx , qe)
97
+ rewrite observe {x = x₁} {x₂} {{eqA}} qx =
98
+ pcong (_,_ _) (observeExtend (D x₂) {{apply eqD x₂}} e₁ e₂ qe)
99
+ observeExtend (D ⊛ E) {{eqD , eqE}} (d₁ , e₁) (d₂ , e₂) (qd , qe) =
100
+ pcong₂ _,_ (observeSem D {{eqD}} d₁ d₂ qd) (observeExtend E {{eqE}} e₁ e₂ qe)
101
+
102
+ observeMu : ∀ {i a} {ι : Level i} {α : Level a} {I : Type ι} {j}
103
+ {D : Desc I α} {d e : μ D j} {{eqD : ExtendEq D}}
104
+ -> ⟦ d ≅ e ⟧ -> d ≡ e
105
+ observeMu {D = D} {node e₁} {node e₂} q = pcong node (observeExtend D e₁ e₂ q)
106
+
107
+ observe : ∀ {a} {α : Level a} {A : Univ α} {x y : ⟦ A ⟧} {{eqA : Eq A}} -> ⟦ x ≅ y ⟧ -> x ≡ y
108
+ observe {A = bot } {()} {()}
109
+ observe {A = top } q = prefl
110
+ observe {A = nat } q = coerceFamℕ (_ ≡_) q prefl
111
+ observe {A = enum n } {e₁} {e₂} q = coerceFamEnum (_ ≡_) q prefl
112
+ observe {A = univ α } {{()}}
113
+ observe {A = σ A B } {x₁ , y₁} {x₂ , y₂} {{eqA , eqB}} (qx , qy)
114
+ rewrite observe {x = x₁} {x₂} {{eqA}} qx = pcong (_,_ _) (observe {{apply eqB x₂}} qy)
115
+ observe {A = π A B } {{()}}
116
+ observe {A = desc I α} {{()}}
117
+ observe {A = imu D j } {node e₁} {node e₂} q = observeMu q
118
+
119
+ module _ where
120
+ open import Relation.Binary.PropositionalEquality.TrustMe
121
+
122
+ eobserve : ∀ {a} {α : Level a} {A : Univ α} {x y : ⟦ A ⟧} {{eqA : Eq A}} -> ⟦ x ≅ y ⟧ -> x ≡ y
123
+ eobserve = erase ∘ observe
124
+
74
125
private
75
126
module Test where
76
127
open import OTT.Data.Fin
0 commit comments