module Library.Logic where
infixr 1 _<=>_
infix 2 Σ-syntax ∃-syntax
infixr 2 _∨_
infixr 3 _∧_
infixr 4 _,_
data ⊥ : Set where
data ⊤ : Set where
<> : ⊤
data Σ {ℓ} (A : Set ℓ) (P : A -> Set) : Set ℓ where
_,_ : ∀(x : A) -> P x -> Σ A P
Σ-syntax : ∀{ℓ} (A : Set ℓ) (P : A -> Set) -> Set ℓ
Σ-syntax = Σ
syntax Σ-syntax A (λ x -> P) = Σ[ x ∈ A ] P
fst : ∀{ℓ} {A : Set ℓ} {P : A -> Set} -> Σ A P -> A
fst (x , _) = x
snd : ∀{ℓ} {A : Set ℓ} {P : A -> Set} (p : Σ A P) -> P (fst p)
snd (_ , y) = y
∃ : ∀{ℓ} {A : Set ℓ} -> (A -> Set) -> Set ℓ
∃ = Σ _
∃-syntax : ∀{ℓ} {A : Set ℓ} -> (A -> Set) -> Set ℓ
∃-syntax = ∃
syntax ∃-syntax (λ x -> B) = ∃[ x ] B
_∧_ : Set -> Set -> Set
A ∧ B = Σ A λ _ -> B
data _∨_ (A B : Set) : Set where
inl : A -> A ∨ B
inr : B -> A ∨ B
¬_ : Set -> Set
¬_ A = A -> ⊥
Decidable : Set -> Set
Decidable A = ¬ A ∨ A
_<=>_ : Set -> Set -> Set
A <=> B = (A -> B) ∧ (B -> A)