Раздел 3.6 доказательства теорем в Lean показывает следующее :
example : p ∨ (q ∧ r) ↔ (p ∨ q) ∧ (p ∨ r) := sorry
Поскольку здесь задействовано iff
, давайте сначала продемонстрируем одно направление, слева направо:
example : p ∨ (q ∧ r) → (p ∨ q) ∧ (p ∨ r) :=
(assume h : p ∨ (q ∧ r),
or.elim h
(assume hp : p,
show (p ∨ q) ∧ (p ∨ r), from ⟨or.inl hp, or.inl hp⟩)
(assume hqr : q ∧ r,
have hq : q, from hqr.left,
have hr : r, from hqr.right,
show (p ∨ q) ∧ (p ∨ r), from ⟨or.inr hq, or.inr hr⟩))
Чтобы пойти в другом направлении, мы должны показать:
(p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r)
В свете примеров, показанных до сих пор в книге, этот отличается тем, что в левой части используются два or
выражения ... Таким образом, мне кажется, что мне пришлось бы использовать or.elim
дважды. ..
Я испортил несколько подходов. Вот тот, который помещает один or.elim
внутри другого:
example : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) :=
(assume h : (p ∨ q) ∧ (p ∨ r),
have hpq : p ∨ q, from h.left,
have hpr : p ∨ r, from h.right,
or.elim hpq
(assume hp : p,
show p ∨ (q ∧ r), from or.inl hp)
(assume hq : q,
or.elim hpr
(assume hp : p,
show p ∨ (q ∧ r), from or.inl hp)
(assume hr : r,
show p ∨ (q ∧ r), from or.inr ⟨hq, hr⟩)))
Одна вещь, которая кажется мне здесь странной, заключается в том, что следующее выражение встречается дважды:
(assume hp : p,
show p ∨ (q ∧ r), from or.inl hp)
Есть ли подход, исключающий такое дублирование?
Есть ли более идиоматический подход?
or.inl
. Если вы хотите использовать тактику, все доказательство, скорее всего, может быть уменьшено доby tauto
(я не проверял это). - person jmc   schedule 16.10.2019