Zulip Chat Archive
Stream: new members
Topic: distributing `or`
Iocta (Dec 29 2019 at 01:36):
This clearly isn't on the right track,
def factor_or : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) := (λ h, or.elim (and.left h) -- p is true. or.inl -- If p is false, q and r are true. -- But we don't really know that p is false. (λ z, (or.inr (and.intro z _))) )
but lean doesn't like or.elim (p \or \not p)
either.
def factor_or : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) := (λ h, or.elim (p ∨ ¬p) -- p is true. or.inl -- p is false, so q and r are true. (λ z, (or.inr (and.intro z _))) )
How can I go about this?
Kenny Lau (Dec 29 2019 at 02:02):
the p or not p
needs to be replaced with a proof of p or not p
Kenny Lau (Dec 29 2019 at 02:02):
which is classical.em p
Kenny Lau (Dec 29 2019 at 02:02):
or maybe classical.em
, I don't remember
Iocta (Dec 29 2019 at 05:24):
This is in the section of the exercises that I think isn't supposed to require classical
. Is there a way to do it without?
Joe (Dec 29 2019 at 05:42):
lemma factor_or : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) := λh, or.elim h.left or.inl $ λhq, or.elim h.right or.inl $ λhr, or.inr $ and.intro hq hr
Yury G. Kudryashov (Dec 29 2019 at 05:43):
Try to do or.elim
on both and.left h
and and.right h
.
Iocta (Dec 29 2019 at 06:12):
Got it, thanks.
def factor_or : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) := (λ h, (or.elim h.left or.inl (λ qq, or.elim h.right or.inl (λ rr, (or.inr (and.intro qq rr))))))
Yury G. Kudryashov (Dec 29 2019 at 06:14):
BTW, it makes sense to use theorem
/lemma
in this case because the conclusion is a proposition, not a Type
.
Iocta (Dec 29 2019 at 06:37):
Ok
Luis O'Shea (Jan 04 2020 at 15:28):
Below is the same proof written in a slightly different way. It illustrates
- Using dot syntax to deal with
and
followed byor
:h.left.elim
andh.right.elim
- Letting Lean infer the
and
constructor by using angle brackets:⟨hq,hr⟩
I'm not saying it's stylistically better (it's just an example of some Lean syntax which may be of interest).
example (h: (p ∨ q) ∧ (p ∨ r)) : p ∨ (q ∧ r) := h.left.elim or.inl (assume hq, h.right.elim or.inl (assume hr, or.inr ⟨hq,hr⟩))
Last updated: Dec 20 2023 at 11:08 UTC