module Prelude where open import Function.Bundles using (_⇔_; Equivalence) open import Data.List using (List; _∷_; []; _++_; filter) open import Data.List.Membership.Propositional using (_∈_; _∉_) open import Data.List.Relation.Unary.Any using (here; there) open import Data.String using (String) open import Data.Sum using (_⊎_) renaming (inj₁ to inl; inj₂ to inr) open import Relation.Nullary using (¬?; ¬_) open import Relation.Binary.Definitions using (DecidableEquality) open import Relation.Binary.PropositionalEquality using (refl; cong) open Equivalence using (from; to; to-cong; from-cong) record DecidableEq {ℓ} (A : Set ℓ) : Set ℓ where field _≟_ : DecidableEquality A infix 4 _≟_ open DecidableEq {{...}} public instance DecidableEq-String : DecidableEq String DecidableEq-String = record { _≟_ = Data.String._≟_ } ∈-add : ∀ {ℓ A} {a : A} {s t : List {ℓ} A} → (a ∈ s ++ t) ⇔ (a ∈ s ⊎ a ∈ t) ∈-add {s = []} .to x = inr x ∈-add {s = s ∷ ss} .to (here refl) = inl (here refl) ∈-add {s = s ∷ ss} .to (there x) with ∈-add {s = ss} .to x ... | inl q = inl (there q) ... | inr q = inr q ∈-add {s = []} .from (inr x) = x ∈-add {s = s ∷ ss} .from (inl (here refl)) = here refl ∈-add {s = s ∷ ss} .from (inl (there x)) = there (∈-add .from (inl x)) ∈-add {s = s ∷ ss} .from (inr x) = there (∈-add .from (inr x)) ∈-add .to-cong = cong (∈-add .to) ∈-add .from-cong = cong (∈-add .from) ∉-add : ∀ {ℓ A} {a : A} {s t : List {ℓ} A} → (a ∉ s ++ t) ⇔ (¬ (a ∈ s ⊎ a ∈ t)) ∉-add .to m x = m (∈-add .from x) ∉-add .from m x = m (∈-add .to x) ∉-add .to-cong = cong (∉-add .to) ∉-add .from-cong = cong (∉-add .from) _\\_ : {A : Set} → {{_ : DecidableEq A}} → List A → A → List A xs \\ x = filter (λ y → ¬? (x ≟ y)) xs infix 7 _\\_