{-# OPTIONS --allow-unsolved-metas #-} module finiteSet where open import Data.Nat hiding ( _≟_ ) open import Data.Fin renaming ( _<_ to _<<_ ) hiding (_≤_) open import Data.Fin.Properties open import Data.Empty open import Relation.Nullary open import Relation.Binary.Core open import Relation.Binary.PropositionalEquality open import logic open import nat open import Data.Nat.Properties hiding ( _≟_ ) open import Relation.Binary.HeterogeneousEquality as HE using (_≅_ ) record Found ( Q : Set ) (p : Q → Bool ) : Set where field found-q : Q found-p : p found-q ≡ true lt0 : (n : ℕ) → n Data.Nat.≤ n lt0 zero = z≤n lt0 (suc n) = s≤s (lt0 n) lt2 : {m n : ℕ} → m < n → m Data.Nat.≤ n lt2 {zero} lt = z≤n lt2 {suc m} {zero} () lt2 {suc m} {suc n} (s≤s lt) = s≤s (lt2 lt) record FiniteSet ( Q : Set ) { n : ℕ } : Set where field Q←F : Fin n → Q F←Q : Q → Fin n finiso→ : (q : Q) → Q←F ( F←Q q ) ≡ q finiso← : (f : Fin n ) → F←Q ( Q←F f ) ≡ f finℕ : ℕ finℕ = n exists1 : (m : ℕ ) → m Data.Nat.≤ n → (Q → Bool) → Bool exists1 zero _ _ = false exists1 ( suc m ) m ¬a ¬b c = ⊥-elim ( nat-≤> mn = ⊥-elim (nat-≤> i>n (fin ¬a ¬b c = ⊥-elim ( nat-≤> c (elm ¬a ¬b c = ⊥-elim ( ¬b c1 ) ISO.iso← iso (case2 x) with Data.Nat.Properties.<-cmp (toℕ (FiniteSet.F←Q fa (elm x))) n ISO.iso← iso (case2 x) | tri< a ¬b ¬c = cong ( λ k → case2 record { elm = elm x ; elm ¬a ¬b c = ⊥-elim ( nat-<> c (elm ¬a ¬b c = ⊥-elim ( nat-≤> c (elm ¬a ¬b c = ⊥-elim ( nat-≤> c (elm