module LogicalFacts where
infixl 30 _∘_
open import Logic
_∘_ : {A B : Ω} {C : B → Ω} →
(∀(b : B) → C b) → ∀(f : A → B) → ∀(a : A) → C(f a)
g ∘ f = λ x → g(f x)
id : {A : Ω} → A → A
id x = x
uncurry : {A B C : Ω} →
(A → B → C) → A ∧ B → C
uncurry f (∧-intro a b) = f a b
curry : {A B C : Ω} →
(A ∧ B → C) → A → B → C
curry f a b = f(∧-intro a b)
double-negation-intro : {R A : Ω} →
A → ((A → R) → R)
double-negation-intro a p = p a
contra-positive : {R A B : Ω} →
(A → B) → (B → R) → (A → R)
contra-positive f p = p ∘ f
three-negations-imply-one : {R A : Ω} →
(((A → R) → R) → R) → (A → R)
three-negations-imply-one = contra-positive double-negation-intro
not-exists-implies-forall-not : {R : Ω} → {X : Set} → {A : X → Ω} →
((∃ \(x : X) → A x) → R) → ∀(x : X) → A x → R
not-exists-implies-forall-not f x a = f(∃-intro x a)
forall-not-implies-not-exists : {R : Ω} → {X : Set} → {A : X → Ω} →
(∀(x : X) → A x → R) → (∃ \(x : X) → A x) → R
forall-not-implies-not-exists f (∃-intro x a) = f x a
∃-functor : {X : Set} {A B : X → Ω} →
({x : X} → A x → B x) →
(∃ \(x : X) → A x) → ∃ \(x : X) → B x
∃-functor f (∃-intro x a) = ∃-intro x (f a)
∃-nested-functor : {X Y : Set} {A B : X → Y → Ω} →
({x : X} → {y : Y} → A x y → B x y) →
(∃ \(x : X) → ∃ \(y : Y) → A x y) → ∃ \(x : X) → ∃ \(y : Y) → B x y
∃-nested-functor f = ∃-functor (λ a → ∃-functor f a)