首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >例子:(p∨q)∧(p∨r)→p∨(q∧r)

例子:(p∨q)∧(p∨r)→p∨(q∧r)
EN

Stack Overflow用户
提问于 2019-10-16 05:47:18
回答 1查看 564关注 0票数 1

第3.6节定理证明在精益说明如下:

代码语言:javascript
复制
example : p ∨ (q ∧ r) ↔ (p ∨ q) ∧ (p ∨ r) := sorry

由于这涉及到iff,让我们先演示一个方向,从左到右:

代码语言:javascript
复制
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⟩))

要走另一个方向,我们必须表明:

代码语言:javascript
复制
(p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r)

根据到目前为止书中的例子,这个例子是不同的,因为左手边涉及两个 or表达式.看来我得用or.elim两次了.

我搞砸了几个方法。这里有一个嵌套在另一个or.elim中的实例:

代码语言:javascript
复制
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⟩)))

有一件事让我觉得奇怪的是,下面的表达式出现了两次:

代码语言:javascript
复制
(assume hp : p,

    show p ∨ (q ∧ r), from or.inl hp)

有没有一种不涉及这种重复的方法?

有没有更地道的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-16 07:53:29

使用精益定理的证明中教授的第一种方法的方法并不是真正的惯用,因为精益的数学库中的代码要么是以战术模式编写的(在本书后面讨论过),要么是以完整的方式编写的。这里有一个战术模式证明:

代码语言:javascript
复制
import tactic.rcases -- advanced mathlib tactics, to speed things up a bit
variables (p q r : Prop)

example : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) :=
begin
  rintro ⟨hpq,hpr⟩,
  cases hpq, -- this is or.elim
    left, assumption, -- first show
  cases hpr, -- second or.elim
    left, assumption, -- second show
  right, exact ⟨hpq, hpr⟩
end

我在这里也看不出如何避免重复的代码-- left, assumption才是assume, show的角色。如果要避免导入,可以将rintro行更改为intro h, cases h with hpq hpr,

然而,这种逻辑证明可以很容易地以直截了当的方式编写:

代码语言:javascript
复制
example (p q r : Prop) : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) :=
λ ⟨hpq, hpr⟩, or.elim hpq or.inl $ λ hq, or.elim hpr or.inl $ λ hr, or.inr ⟨hq, hr⟩

“复制”现在只是一个事实,即函数or.inl出现了两次。我的感觉是,因为p可以从假设中用两种不同的方式被证明,所以你需要在某个地方重复,因为你处在两个不同的“线程”中。一旦您了解精益的_孔功能的威力,就不难构建这样的术语。例如,在构建这个lambda项的过程中,我的会话如下所示:

代码语言:javascript
复制
example (p q r : Prop) : (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) :=
λ ⟨hpq, hpr⟩, or.elim hpq or.inl $ _

洞边的错误告诉我我需要构造哪个术语来填充它。

最后,正如@jmc所言,这样的事情可以用战术来解决,这可能是解决这个目标的惯用方法:

代码语言:javascript
复制
import tactic.tauto

example (p q r : Prop): (p ∨ q) ∧ (p ∨ r) → p ∨ (q ∧ r) :=
by tauto!

注意这里的进口。精益的数学库mathlib不仅仅是一个数学库,数学家在那里创造了数学,计算机科学家也制定了强有力的策略,这使得每个人(不仅仅是数学家)的生活变得更好。

如果您还有更多的问题,获得答案的一个更有效的方法就是在在祖利普的精益聊天上提问,也许是在#新成员流中。那里的一组人通常处理事情的效率很高。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58406492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档