comparison automaton-in-agda/src/finiteSetUtil.agda @ 404:dfaf230f7b9a

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 24 Sep 2023 13:20:31 +0900
parents c298981108c1
children af8f630b7e60
comparison
equal deleted inserted replaced
403:c298981108c1 404:dfaf230f7b9a
335 ... | yes _ = h 335 ... | yes _ = h
336 ... | no _ = List2Func {Q} fin (NP.<-trans n<m a<sa ) t q 336 ... | no _ = List2Func {Q} fin (NP.<-trans n<m a<sa ) t q
337 337
338 open import Level renaming ( suc to Suc ; zero to Zero) 338 open import Level renaming ( suc to Suc ; zero to Zero)
339 339
340 F2L-iso : { Q : Set } → (fin : FiniteSet Q ) → (x : Vec Bool (FiniteSet.finite fin) ) → F2L fin a<sa (λ q _ → List2Func fin a<sa x q ) ≡ x
341 F2L-iso {Q} fin x = f2l m a<sa x where
342 m = FiniteSet.finite fin
343 f2l : (n : ℕ ) → (n<m : n < suc m )→ (x : Vec Bool n ) → F2L fin n<m (λ q q<n → List2Func fin n<m x q ) ≡ x
344 f2l zero (s≤s z≤n) [] = refl
345 f2l (suc n) (s≤s n<m) (h ∷ t ) = lemma1 lemma2 lemma3f where
346 lemma1 : {n : ℕ } → {h h1 : Bool } → {t t1 : Vec Bool n } → h ≡ h1 → t ≡ t1 → h ∷ t ≡ h1 ∷ t1
347 lemma1 refl refl = refl
348 lemma2 : List2Func fin (s≤s n<m) (h ∷ t) (FiniteSet.Q←F fin (fromℕ< n<m)) ≡ h
349 lemma2 with FiniteSet.F←Q fin (FiniteSet.Q←F fin (fromℕ< n<m)) ≟ fromℕ< n<m
350 lemma2 | yes p = refl
351 lemma2 | no ¬p = ⊥-elim ( ¬p (FiniteSet.finiso← fin _) )
352 lemma4 : (q : Q ) → toℕ (FiniteSet.F←Q fin q ) < n → List2Func fin (s≤s n<m) (h ∷ t) q ≡ List2Func fin (NP.<-trans n<m a<sa) t q
353 lemma4 q _ with FiniteSet.F←Q fin q ≟ fromℕ< n<m
354 lemma4 q lt | yes p = ⊥-elim ( nat-≡< (toℕ-fromℕ< n<m) (lemma5 n lt (cong (λ k → toℕ k) p))) where
355 lemma5 : {j k : ℕ } → ( n : ℕ) → suc j ≤ n → j ≡ k → k < n
356 lemma5 {zero} (suc n) (s≤s z≤n) refl = s≤s z≤n
357 lemma5 {suc j} (suc n) (s≤s lt) refl = s≤s (lemma5 {j} n lt refl)
358 lemma4 q _ | no ¬p = refl
359 lemma3f : F2L fin (NP.<-trans n<m a<sa) (λ q q<n → List2Func fin (s≤s n<m) (h ∷ t) q ) ≡ t
360 lemma3f = begin
361 F2L fin (NP.<-trans n<m a<sa) (λ q q<n → List2Func fin (s≤s n<m) (h ∷ t) q )
362 ≡⟨ cong (λ k → F2L fin (NP.<-trans n<m a<sa) ?) ? ⟩
363 F2L fin (NP.<-trans n<m a<sa) (λ q q<n → List2Func fin (NP.<-trans n<m a<sa) t q )
364 ≡⟨ f2l n (NP.<-trans n<m a<sa ) t ⟩
365 t
366 ∎ where
367 open ≡-Reasoning
368
369 340
370 L2F : {Q : Set } {n : ℕ } → (fin : FiniteSet Q ) → n < suc (FiniteSet.finite fin) → Vec Bool n → (q : Q ) → toℕ (FiniteSet.F←Q fin q ) < n → Bool 341 L2F : {Q : Set } {n : ℕ } → (fin : FiniteSet Q ) → n < suc (FiniteSet.finite fin) → Vec Bool n → (q : Q ) → toℕ (FiniteSet.F←Q fin q ) < n → Bool
371 L2F fin n<m x q q<n = List2Func fin n<m x q 342 L2F fin n<m x q q<n = List2Func fin n<m x q
372 343
373 L2F-iso : { Q : Set } → (fin : FiniteSet Q ) → (f : Q → Bool ) → (q : Q ) → (L2F fin a<sa (F2L fin a<sa (λ q _ → f q) )) q (toℕ<n _) ≡ f q 344 L2F-iso : { Q : Set } → (fin : FiniteSet Q ) → (f : Q → Bool ) → (q : Q ) → (L2F fin a<sa (F2L fin a<sa (λ q _ → f q) )) q (toℕ<n _) ≡ f q
394 ≡⟨ cong ( λ k → f k ) (FiniteSet.finiso→ fin _ ) ⟩ 365 ≡⟨ cong ( λ k → f k ) (FiniteSet.finiso→ fin _ ) ⟩
395 f q 366 f q
396 ∎ where 367 ∎ where
397 open ≡-Reasoning 368 open ≡-Reasoning
398 l2f (suc n) (s≤s n<m) (s≤s n<q) | no ¬p = l2f n (NP.<-trans n<m a<sa) (lemma11f n<m ¬p n<q) 369 l2f (suc n) (s≤s n<m) (s≤s n<q) | no ¬p = l2f n (NP.<-trans n<m a<sa) (lemma11f n<m ¬p n<q)
399
400 fin→ : {A : Set} → FiniteSet A → FiniteSet (A → Bool )
401 fin→ {A} fin = iso-fin fin2List iso where
402 a = FiniteSet.finite fin
403 iso : Bijection (Vec Bool a ) (A → Bool)
404 fun← iso x = F2L fin a<sa ( λ q _ → x q )
405 fun→ iso x = List2Func fin a<sa x
406 fiso← iso x = F2L-iso fin x
407 fiso→ iso f = lemma where
408 lemma : List2Func fin a<sa (F2L fin a<sa (λ q _ → f q)) ≡ f
409 lemma = ?
410
411 370
412 Fin2Finite : ( n : ℕ ) → FiniteSet (Fin n) 371 Fin2Finite : ( n : ℕ ) → FiniteSet (Fin n)
413 Fin2Finite n = record { F←Q = λ x → x ; Q←F = λ x → x ; finiso← = λ q → refl ; finiso→ = λ q → refl } 372 Fin2Finite n = record { F←Q = λ x → x ; Q←F = λ x → x ; finiso← = λ q → refl ; finiso→ = λ q → refl }
414 373
415 data fin-less { n : ℕ } { A : Set } (fa : FiniteSet A ) (n<m : n < FiniteSet.finite fa ) : Set where 374 data fin-less { n : ℕ } { A : Set } (fa : FiniteSet A ) (n<m : n < FiniteSet.finite fa ) : Set where
470 FiniteSet.Q←F fa (fromℕ< (NP.<-trans (toℕ<n (Bijection.fun← iso (elm1 elm x))) n<m)) 429 FiniteSet.Q←F fa (fromℕ< (NP.<-trans (toℕ<n (Bijection.fun← iso (elm1 elm x))) n<m))
471 ≡⟨⟩ 430 ≡⟨⟩
472 FiniteSet.Q←F fa (fromℕ< ( NP.<-trans (toℕ<n ( fromℕ< x ) ) n<m)) 431 FiniteSet.Q←F fa (fromℕ< ( NP.<-trans (toℕ<n ( fromℕ< x ) ) n<m))
473 ≡⟨ cong (λ k → FiniteSet.Q←F fa k) (lemma10 lemma13 ) ⟩ 432 ≡⟨ cong (λ k → FiniteSet.Q←F fa k) (lemma10 lemma13 ) ⟩
474 FiniteSet.Q←F fa (fromℕ< ( NP.<-trans x n<m)) 433 FiniteSet.Q←F fa (fromℕ< ( NP.<-trans x n<m))
475 ≡⟨ cong (λ k → FiniteSet.Q←F fa (fromℕ< k )) ? ⟩ 434 ≡⟨ cong (λ k → FiniteSet.Q←F fa k) (lemma10 refl ) ⟩
476 FiniteSet.Q←F fa (fromℕ< ( toℕ<n (FiniteSet.F←Q fa elm))) 435 FiniteSet.Q←F fa (fromℕ< ( toℕ<n (FiniteSet.F←Q fa elm)))
477 ≡⟨ cong (λ k → FiniteSet.Q←F fa k ) ( fromℕ<-toℕ _ _ ) ⟩ 436 ≡⟨ cong (λ k → FiniteSet.Q←F fa k ) ( fromℕ<-toℕ _ _ ) ⟩
478 FiniteSet.Q←F fa (FiniteSet.F←Q fa elm ) 437 FiniteSet.Q←F fa (FiniteSet.F←Q fa elm )
479 ≡⟨ FiniteSet.finiso→ fa _ ⟩ 438 ≡⟨ FiniteSet.finiso→ fa _ ⟩
480 elm 439 elm
634 lem14 with is-B (Q←F fa ( fromℕ< {0} 0<fa )) 593 lem14 with is-B (Q←F fa ( fromℕ< {0} 0<fa ))
635 ... | yes isb = refl 594 ... | yes isb = refl
636 ... | no ne = ⊥-elim (ne isb0) 595 ... | no ne = ⊥-elim (ne isb0)
637 ... | no nisb1 | no nisb0 = z≤n 596 ... | no nisb1 | no nisb0 = z≤n
638 lem01 (suc i) with <-cmp (finite fa) (suc i) | <-cmp (finite fa) (suc (suc i)) 597 lem01 (suc i) with <-cmp (finite fa) (suc i) | <-cmp (finite fa) (suc (suc i))
639 ... | tri< a ¬b ¬c | tri< a₁ ¬b₁ ¬c₁ = refl-≤≡ (sym ? ) 598 ... | tri< a ¬b ¬c | tri< a₁ ¬b₁ ¬c₁ = refl-≤≡ (sym lem14) where
599 lem14 : count-B (suc i) ≡ count-B i
600 lem14 with <-cmp (finite fa) (suc i)
601 ... | tri< a ¬b ¬c = refl
602 ... | tri≈ ¬a b ¬c = ⊥-elim ( ¬a a )
603 ... | tri> ¬a ¬b c = ⊥-elim ( ¬a a )
640 ... | tri< a ¬b ¬c | tri≈ ¬a b ¬c₁ = ⊥-elim (nat-≡< b (<-trans a a<sa)) 604 ... | tri< a ¬b ¬c | tri≈ ¬a b ¬c₁ = ⊥-elim (nat-≡< b (<-trans a a<sa))
641 ... | tri< a ¬b ¬c | tri> ¬a ¬b₁ c = ⊥-elim (nat-<> a (<-trans a<sa c) ) 605 ... | tri< a ¬b ¬c | tri> ¬a ¬b₁ c = ⊥-elim (nat-<> a (<-trans a<sa c) )
642 ... | tri≈ ¬a b ¬c | tri< a ¬b ¬c₁ = refl-≤≡ (sym ?) 606 ... | tri≈ ¬a b ¬c | tri< a ¬b ¬c₁ = refl-≤≡ (sym ?)
643 ... | tri≈ ¬a b ¬c | tri≈ ¬a₁ b₁ ¬c₁ = ⊥-elim (nat-≡< (sym b) (subst (λ k → _ < k ) (sym b₁) a<sa) ) 607 ... | tri≈ ¬a b ¬c | tri≈ ¬a₁ b₁ ¬c₁ = ⊥-elim (nat-≡< (sym b) (subst (λ k → _ < k ) (sym b₁) a<sa) )
644 ... | tri≈ ¬a b ¬c | tri> ¬a₁ ¬b c = ⊥-elim (nat-≡< (sym b) (<-trans a<sa c)) 608 ... | tri≈ ¬a b ¬c | tri> ¬a₁ ¬b c = ⊥-elim (nat-≡< (sym b) (<-trans a<sa c))