annotate agda/finiteSet.agda @ 76:7b357b295272

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 08 Nov 2019 13:40:25 +0900
parents 702ce92c45ab
children faf6fcd36018
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
44
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 module finiteSet where
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
3 open import Data.Nat hiding ( _≟_ )
44
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 open import Data.Fin renaming ( _<_ to _<<_ )
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
5 open import Data.Fin.Properties
76
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
6 open import Data.Empty
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
7 open import Relation.Nullary
44
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 open import Relation.Binary.Core
46
964e4bd0272a add coinduction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
9 open import Relation.Binary.PropositionalEquality
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
10 open import logic
44
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 record FiniteSet ( Q : Set ) { n : ℕ }
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 : Set where
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 field
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 Q←F : Fin n → Q
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 F←Q : Q → Fin n
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 finiso→ : (q : Q) → Q←F ( F←Q q ) ≡ q
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 finiso← : (f : Fin n ) → F←Q ( Q←F f ) ≡ f
70
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
19 finℕ : ℕ
702ce92c45ab add concat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 69
diff changeset
20 finℕ = n
44
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 lt0 : (n : ℕ) → n Data.Nat.≤ n
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 lt0 zero = z≤n
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 lt0 (suc n) = s≤s (lt0 n)
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 lt2 : {m n : ℕ} → m < n → m Data.Nat.≤ n
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 lt2 {zero} lt = z≤n
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 lt2 {suc m} {zero} ()
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 lt2 {suc m} {suc n} (s≤s lt) = s≤s (lt2 lt)
76
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
28 exists1 : (m : ℕ ) → m Data.Nat.≤ n → (Q → Bool) → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
29 exists1 zero _ _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
30 exists1 ( suc m ) m<n p = p (Q←F (fromℕ≤ {m} {n} m<n)) \/ exists1 m (lt2 m<n) p
44
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 exists : ( Q → Bool ) → Bool
76
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
32 exists p = exists1 n (lt0 n) p
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
33 equal? : Q → Q → Bool
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
34 equal? q0 q1 with F←Q q0 ≟ F←Q q1
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
35 ... | yes p = true
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
36 ... | no ¬p = false
76
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
37 not-found : { p : Q → Bool } → ( (q : Q ) → p q ≡ false ) → exists p ≡ false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
38 not-found {p} pn = not-found2 n (lt0 n) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
39 not-found2 : (m : ℕ ) → (m<n : m Data.Nat.≤ n ) → exists1 m m<n p ≡ false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
40 not-found2 zero _ = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
41 not-found2 ( suc m ) m<n with pn (Q←F (fromℕ≤ {m} {n} m<n))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
42 not-found2 (suc m) m<n | eq = begin
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
43 p (Q←F (fromℕ≤ m<n)) \/ exists1 m (lt2 m<n) p
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
44 ≡⟨ cong (λ k → k \/ exists1 m (lt2 m<n) p ) eq ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
45 false \/ exists1 m (lt2 m<n) p
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
46 ≡⟨ bool-or-1 refl ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
47 exists1 m (lt2 m<n) p
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
48 ≡⟨ not-found2 m (lt2 m<n) ⟩
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
49 false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
50 ∎ where open ≡-Reasoning
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
51 not-found1 : { p : Q → Bool } → exists p ≡ false → (q : Q ) → p q ≡ false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
52 not-found1 {p} ne q = not-found3 n (lt0 n) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
53 not-found3 : (m : ℕ ) → (m<n : m Data.Nat.≤ n ) → p q ≡ false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
54 not-found3 zero _ = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
55 not-found3 ( suc m ) m<n = {!!}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
56 found : { p : Q → Bool } → {q : Q } → p q ≡ true → exists p ≡ true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
57 found {p} {q} pt with bool-≡-? (exists p) true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
58 ... | yes eq1 = eq1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
59 ... | no ne = ⊥-elim ( contra-position not-found1 notall (¬-bool-t ne) ) where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
60 notall : ¬ ((q1 : Q) → p q1 ≡ false)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 70
diff changeset
61 notall ne = ¬-bool (ne q) pt
44
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 fless : {n : ℕ} → (f : Fin n ) → toℕ f < n
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 fless zero = s≤s z≤n
aa15eff1aeb3 seprate finite
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 fless (suc f) = s≤s ( fless f )
69
f124fceba460 subset construction
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
66