Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
leanprover-community
GitHub Repository: leanprover-community/tutorials
Path: blob/master/src/solutions/07bis_abstract_negations.lean
212 views
import data.real.basic

open_locale classical

/-
Theoretical negations.

This file is for people interested in logic who want to fully understand
negations.

Here we don't use `contrapose` or `push_neg`. The goal is to prove lemmas
that are used by those tactics. Of course we can use
`exfalso`, `by_contradiction` and `by_cases`.

If this doesn't sound like fun then skip ahead to the next file.
-/

section negation_prop

variables P Q : Prop

-- 0055
example : (P → Q) ↔ (¬ Q → ¬ P) :=
begin
  -- sorry
  split,
  { intros h hnQ hP,
    exact hnQ (h hP) },
  { intros h hP,
    by_contradiction hnQ,
    exact h hnQ hP },
  -- sorry
end

-- 0056
lemma non_imp (P Q : Prop) : ¬ (P → Q) ↔ P ∧ ¬ Q :=
begin
  -- sorry
  split,
  { intro h,
    by_contradiction H,
    apply h,
    intro hP,
    by_contradiction H',
    apply H,
    exact ⟨hP, H'⟩ },
  { intros h h',
    cases h with hP hnQ,
    exact hnQ (h' hP) },
  -- sorry
end

-- In the next one, let's use the axiom
-- propext {P Q : Prop} : (P ↔ Q) → P = Q

-- 0057
example (P : Prop) : ¬ P ↔ P = false :=
begin
  -- sorry
  split,
  { intro h,
    apply propext,
    split,
    { intro h',
      exact h h' },
    { intro h,
      exfalso,
      exact h } },
  { intro h,
    rw h,
    exact id },
  -- sorry
end

end negation_prop

section negation_quantifiers
variables (X : Type) (P : X → Prop)

-- 0058
example : ¬ (∀ x, P x) ↔ ∃ x, ¬ P x :=
begin
  -- sorry
  split,
  { intro h,
    by_contradiction H,
    apply h,
    intros x,
    by_contradiction H',
    apply H,
    use [x, H'] },
  { rintros ⟨x, hx⟩ h',
    exact hx (h' x) },
  -- sorry
end

-- 0059
example : ¬ (∃ x, P x) ↔ ∀ x, ¬ P x :=
begin
  -- sorry
  split,
  { intros h x h',
    apply h,
    use [x, h'] },
  { rintros h ⟨x, hx⟩,
    exact h x hx },
  -- sorry
end

-- 0060
example (P : ℝ → Prop) : ¬ (∃ ε > 0, P ε) ↔ ∀ ε > 0, ¬ P ε :=
begin
  -- sorry
  split,
  { intros h ε ε_pos hP,
    apply h,
    use [ε, ε_pos, hP] },
  { rintros h ⟨ε, ε_pos, hP⟩,
    exact h ε ε_pos hP },
  -- sorry
end

-- 0061
example (P : ℝ → Prop) : ¬ (∀ x > 0, P x) ↔ ∃ x > 0, ¬ P x :=
begin
  -- sorry
  split,
  { intros h,
    by_contradiction H,
    apply h,
    intros x x_pos,
    by_contradiction HP,
    apply H,
    use [x, x_pos, HP] },
  { rintros ⟨x, xpos, hx⟩ h',
    exact hx (h' x xpos) },
  -- sorry
end

end negation_quantifiers