Zulip Chat Archive

Stream: maths

Topic: How to prove unbound_prop


李拯先 (Feb 01 2020 at 05:59):

such as (∀ x, p x ∨ r) → (∀ x, p x) ∨ r, can someone give me some idea or solution

Yury G. Kudryashov (Feb 01 2020 at 06:10):

You need classical.by_cases r here.

李拯先 (Feb 01 2020 at 07:11):

[Quoting…]
How to prove when r is wrong here

Yury G. Kudryashov (Feb 01 2020 at 07:16):

example {α : Type*} {p : α  Prop} {r : Prop} : ( x, p x  r)  ( x, p x)  r :=
λ H, classical.by_cases or.inr (λ hr, or.inl (λ x, (H x).elim id (λ hr', absurd hr' hr)))

李拯先 (Feb 01 2020 at 07:55):

example {α : Type*} {p : α  Prop} {r : Prop} : ( x, p x  r)  ( x, p x)  r :=
λ H, classical.by_cases or.inr (λ hr, or.inl $ λ x, (H x).elim id (λ hr', absurd hr' hr))

I'm so sorry but i want to ask what is $ means here, and i know id meaning but i don't understand what its'meaning here, can you give me a explain? thanks

Yury G. Kudryashov (Feb 01 2020 at 08:09):

Removed the dollar sign. f $ x is f x, f $ g x is f (g x) etc.

Bryan Gin-ge Chen (Feb 01 2020 at 08:42):

(f $ x y z) means the same thing as (f (x y z)). It lets you write function application with fewer parentheses.

i know id meaning but i don't understand what its'meaning here

Let's start by investigating λ x, (H x).elim id (λ hr', absurd hr' hr). If you replace that entire term with an underscore, Lean will report an error which will tell you what the type is:

example {α : Type*} {p : α  Prop} {r : Prop} : ( x, p x  r)  ( x, p x)  r :=
λ H, classical.by_cases or.inr (λ hr, or.inl $ _)
/-
don't know how to synthesize placeholder
context:
α : Type ?,
p : α → Prop,
r : Prop,
H : ∀ (x : α), p x ∨ r,
hr : ¬r
⊢ ∀ (x : α), p x
-/

This tells us that λ x, (H x).elim id (λ hr', absurd hr' hr) : ∀ (x : α), p x and hence (H x).elim id (λ hr', absurd hr' hr) : p x.

Next, you should be able to see that (H x) has type p x ∨ r (try putting your cursor over H and x in your editor). What may be less familiar is that (H x).elim is short for or.elim (H x) (this uses Lean's "dot notation", see the text after "Lean provides another useful syntactic gadget" in 3.1 of Theorem Proving in Lean).

or.elim has type ∀ {a b c : Prop}, a ∨ b → (a → c) → (b → c) → c, so (H x).elim has type: (p x → p x) → (r → p x) → p x. The type of the first argument is (p x → p x), which matches the type of id : Π {α : Sort u_1}, α → α. You could also replace id with the equivalent term, λ hpx, hpx.

Informally, the last paragraph above could be stated this way: we've shown p x ∨ r and we want to prove p x. We have two cases, and the first one is to show p x from p x. This trivial implication is id.

李拯先 (Feb 01 2020 at 09:30):

Thank you very much, your explanation help me a lot.

Kevin Buzzard (Feb 01 2020 at 11:58):

import tactic

example : 1 + 1 = 2 := rfl

open_locale classical

example (X : Type) (p : X  Prop) (r : Prop) :
( x, p x  r)  ( x, p x)  r :=
begin
  intro h,
  by_cases hr : r,
  { -- r is true
    right,
    assumption
  },
  { -- r is false
    left,
    intro x,
    cases h x,
    { assumption},
    { contradiction}
  }
end

Last updated: Dec 20 2023 at 11:08 UTC