comparison ordinal.agda @ 261:d9d178d1457c

ε-induction from TransFinite induction
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 17 Sep 2019 09:29:27 +0900
parents c10048d69614
children 53744836020b
comparison
equal deleted inserted replaced
260:8b85949bde00 261:d9d178d1457c
239 import OD 239 import OD
240 -- open inOrdinal C-Ordinal 240 -- open inOrdinal C-Ordinal
241 open OD (C-Ordinal {n}) 241 open OD (C-Ordinal {n})
242 open OD.OD 242 open OD.OD
243 243
244 --
245 -- another form of regularity
246 --
247 ε-induction : {m : Level} { ψ : OD → Set m}
248 → ( {x : OD } → ({ y : OD } → x ∋ y → ψ y ) → ψ x )
249 → (x : OD ) → ψ x
250 ε-induction {m} {ψ} ind x = subst (λ k → ψ k ) oiso (ε-induction-ord (lv (osuc (od→ord x))) (ord (osuc (od→ord x))) <-osuc) where
251 ε-induction-ord : (lx : Nat) ( ox : OrdinalD {suc n} lx ) {ly : Nat} {oy : OrdinalD {suc n} ly }
252 → (ly < lx) ∨ (oy d< ox ) → ψ (ord→od (record { lv = ly ; ord = oy } ) )
253 ε-induction-ord lx (OSuc lx ox) {ly} {oy} y<x =
254 ind {ord→od (record { lv = ly ; ord = oy })} ( λ {y} lt → subst (λ k → ψ k ) oiso (ε-induction-ord lx ox (lemma y lt ))) where
255 lemma : (z : OD) → ord→od record { lv = ly ; ord = oy } ∋ z → od→ord z o< record { lv = lx ; ord = ox }
256 lemma z lt with osuc-≡< y<x
257 lemma z lt | case1 refl = o<-subst (c<→o< lt) refl diso
258 lemma z lt | case2 lt1 = ordtrans (o<-subst (c<→o< lt) refl diso) lt1
259 ε-induction-ord (Suc lx) (Φ (Suc lx)) {ly} {oy} (case1 y<sox ) =
260 ind {ord→od (record { lv = ly ; ord = oy })} ( λ {y} lt → lemma y lt ) where
261 --
262 -- if lv of z if less than x Ok
263 -- else lv z = lv x. We can create OSuc of z which is larger than z and less than x in lemma
264 --
265 -- lx Suc lx (1) lz(a) <lx by case1
266 -- ly(1) ly(2) (2) lz(b) <lx by case1
267 -- lz(a) lz(b) lz(c) lz(c) <lx by case2 ( ly==lz==lx)
268 --
269 lemma0 : { lx ly : Nat } → ly < Suc lx → lx < ly → ⊥
270 lemma0 {Suc lx} {Suc ly} (s≤s lt1) (s≤s lt2) = lemma0 lt1 lt2
271 lemma1 : {ly : Nat} {oy : OrdinalD {suc n} ly} → lv (od→ord (ord→od (record { lv = ly ; ord = oy }))) ≡ ly
272 lemma1 {ly} {oy} = let open ≡-Reasoning in begin
273 lv (od→ord (ord→od (record { lv = ly ; ord = oy })))
274 ≡⟨ cong ( λ k → lv k ) diso ⟩
275 lv (record { lv = ly ; ord = oy })
276 ≡⟨⟩
277 ly
278
279 lemma : (z : OD) → ord→od record { lv = ly ; ord = oy } ∋ z → ψ z
280 lemma z lt with c<→o< {z} {ord→od (record { lv = ly ; ord = oy })} lt
281 lemma z lt | case1 lz<ly with <-cmp lx ly
282 lemma z lt | case1 lz<ly | tri< a ¬b ¬c = ⊥-elim ( lemma0 y<sox a) -- can't happen
283 lemma z lt | case1 lz<ly | tri≈ ¬a refl ¬c = -- ly(1)
284 subst (λ k → ψ k ) oiso (ε-induction-ord lx (Φ lx) {_} {ord (od→ord z)} (case1 (subst (λ k → lv (od→ord z) < k ) lemma1 lz<ly ) ))
285 lemma z lt | case1 lz<ly | tri> ¬a ¬b c = -- lz(a)
286 subst (λ k → ψ k ) oiso (ε-induction-ord lx (Φ lx) {_} {ord (od→ord z)} (case1 (<-trans lz<ly (subst (λ k → k < lx ) (sym lemma1) c))))
287 lemma z lt | case2 lz=ly with <-cmp lx ly
288 lemma z lt | case2 lz=ly | tri< a ¬b ¬c = ⊥-elim ( lemma0 y<sox a) -- can't happen
289 lemma z lt | case2 lz=ly | tri> ¬a ¬b c with d<→lv lz=ly -- lz(b)
290 ... | eq = subst (λ k → ψ k ) oiso
291 (ε-induction-ord lx (Φ lx) {_} {ord (od→ord z)} (case1 (subst (λ k → k < lx ) (trans (sym lemma1)(sym eq) ) c )))
292 lemma z lt | case2 lz=ly | tri≈ ¬a lx=ly ¬c with d<→lv lz=ly -- lz(c)
293 ... | eq = subst (λ k → ψ k ) oiso ( ε-induction-ord lx (dz oz=lx) {lv (od→ord z)} {ord (od→ord z)} (case2 (dz<dz oz=lx) )) where
294 oz=lx : lv (od→ord z) ≡ lx
295 oz=lx = let open ≡-Reasoning in begin
296 lv (od→ord z)
297 ≡⟨ eq ⟩
298 lv (od→ord (ord→od (ordinal ly oy)))
299 ≡⟨ cong ( λ k → lv k ) diso ⟩
300 lv (ordinal ly oy)
301 ≡⟨ sym lx=ly ⟩
302 lx
303
304 dz : lv (od→ord z) ≡ lx → OrdinalD lx
305 dz refl = OSuc lx (ord (od→ord z))
306 dz<dz : (z=x : lv (od→ord z) ≡ lx ) → ord (od→ord z) d< dz z=x
307 dz<dz refl = s<refl
308