open import Relation.Binary.Bundles open import Relation.Binary.Structures open import Agda.Primitive open import Data.Product open import Function.Base open import Function.Equality hiding (_∘_ ; const ; flip) open import Function.Bijection hiding (_∘_) open import Function.Injection hiding (_∘_) open import Relation.Binary open import Data.String open import ListAssoc String _≟_ open import Data.List.Relation.Unary.Any renaming (Any to Anyₗ) open import Data.Maybe.Relation.Unary.Any open import Relation.Binary.PropositionalEquality open import Data.List open import Relation.Unary renaming (Decidable to Decidableₚ) hiding (_∈_) open import Relation.Nullary open import Data.Empty open import Data.String.Properties open import Data.List.Membership.Setoid Data.String.Properties.≡-setoid open import Data.Nat hiding (_⊔_) module Helper where imageSetoid : ∀ {a₁ a₂ b₁ b₂} {A : Setoid a₁ a₂} {B : Setoid b₁ b₂} (f : A ⟶ B) → Setoid (a₁ ⊔ b₁ ⊔ b₂) b₂ imageSetoid {B = record { Carrier = _ ; _≈_ = _≈_ ; isEquivalence = record { refl = r ; sym = s ; trans = t }}} record { _⟨$⟩_ = _⟨$⟩_ ; cong = cong } = record { Carrier = ∃ λ y → ∃ (y ≈_ ∘ _⟨$⟩_) ; _≈_ = _≈_ on proj₁ ; isEquivalence = record { refl = r ; sym = s ; trans = t } } imageFunction : ∀ {a₁ a₂ b₁ b₂} {A : Setoid a₁ a₂} {B : Setoid b₁ b₂} (f : A ⟶ B) → (A ⟶ imageSetoid f) imageFunction {B = B} record { _⟨$⟩_ = f ; cong = cong } = let refl≈ = IsEquivalence.refl (Setoid.isEquivalence B) in record { _⟨$⟩_ = λ x → f x , x , refl≈ ; cong = cong } injtobij : ∀ {a₁ a₂ b₁ b₂} {A : Setoid a₁ a₂} {B : Setoid b₁ b₂} {f} → Injective {A = A} {B} f → Bijective (imageFunction f) injtobij {B = record { Carrier = Carrier ; _≈_ = _ ; isEquivalence = record { refl = _ ; sym = s ; trans = t }}} inj = record { injective = inj ; surjective = record { from = record { _⟨$⟩_ = proj₁ ∘ proj₂ ; cong = λ { {_ , _ , y} {_ , _ , z} → inj ∘ t (s y) ∘ flip t z}} ; right-inverse-of = s ∘ proj₂ ∘ proj₂ }} _-⟦_⟧-_ : ∀ {a b c d e} {A : Set a} {B : Set b} {C : Set c} {D : Set d} {E : Set e} → (A → B) → (B → D → E) → (C → D) → (A → C → E) f -⟦ _*_ ⟧- g = (λ x _ → f x) -[ _*_ ]- λ _ z → g z infix 20 _-⟦_⟧-_ _>[_]>_ : ∀ {ℓ} {I : Set} {P P' Q : Pred I ℓ} {R : Rel I ℓ} (v : ∃ λ (j : ∃ P) → (Q ∘ proj₁) j) (p : ∀ {j k} → Q j → R k j → Q k) (h : ∀ (x : ∃ P) → ∃ λ (y : ∃ P') → R (proj₁ y) (proj₁ x)) → ∃ λ (j : ∃ P') → (Q ∘ proj₁) j _>[_]>_ (v , Qv) p h with h v _>[_]>_ (v , Qv) p h | w , Rwv = w , p Qv Rwv infixl 5 _>[_]>_ getp : ∀ {x} {ℓ b} {B : Set b} {P : Pred B ℓ} {m : Map {B = B}} → Any P (get x m) → x ∈ₗ m getp {x} {m = m} _ with dec∈ₗ x m getp {x} {m = m} p | yes q = q sub : ∀ {a b} → a ≤ b → ℕ sub (z≤n {n}) = n sub (s≤s p) = sub p prop← : ∀ {ℓ} {B : Set ℓ} {m : Map {B = B}} {x} → x ∈ₗ m → x ∈ (keys m) prop← (here px) = here px prop← {m = m} (there p) = there (prop← {m = trim m λ {()}} p) fromSample : ∀ {a ℓ} {A : Set a} {P : Pred A ℓ} (l : List A) → Decidableₚ P → (∀ {x} → ¬ Anyₗ (x ≡_) l → ¬ P x) → Dec (∃ P) fromSample [] _ q = no λ {(_ , px) → q (λ {()}) px} fromSample (x ∷ _) decp _ with decp x fromSample (x ∷ _) _ _ | yes p = yes (x , p) fromSample (x ∷ l) decp q | no ¬p = fromSample l decp λ ¬avl pv → q (λ {(here refl) → ⊥-elim (¬p pv) ; (there avl) → ¬avl avl}) pv ∃P×Q→∃P : ∀ {a b c} {A : Set a} {P : Pred A b} {Q : A → Set c} → ∃ (P ∩ Q) → ∃ P ∃P×Q→∃P (v , Pv , _) = v , Pv ∃!→∃ : ∀ {a b ℓ} {A : Set a} {P : A → Set b} {_≈_} → ∃! {ℓ = ℓ} _≈_ P → ∃ P ∃!→∃ = ∃P×Q→∃P