Lean 在精益(命题逻辑)中用多个假设表示一个定理

Lean 在精益(命题逻辑)中用多个假设表示一个定理,lean,Lean,真正的初学者在这里提问。我如何用精益生产中的多个假设来表示一个问题?例如: 给定 A. A.→B A.→C B→D C→D 证明命题D 第二课时的问题,第三题。我实际上是在读书,但那里的练习很少 显然,通过两次应用ponens方法来证明这一点是完全微不足道的,我的问题是,首先我如何表示这个问题?!这是我的证据: variables A B C D : Prop example : (( A ) /\ ( A->B ) /\ ( A->C )

真正的初学者在这里提问。我如何用精益生产中的多个假设来表示一个问题?例如:

给定

A. A.→B A.→C B→D C→D 证明命题D

第二课时的问题,第三题。我实际上是在读书,但那里的练习很少

显然,通过两次应用ponens方法来证明这一点是完全微不足道的,我的问题是,首先我如何表示这个问题?!这是我的证据:

variables A B C D : Prop

example : (( A    )
    /\     ( A->B )
    /\     ( A->C )
    /\     ( B->D )
    /\     ( C->D ))
-> D :=
assume h,
have given1: A, from and.left h,
have given2: A -> B, from and.left (and.right h),
have given3: A -> C, from and.left (and.right (and.right h)),
have given4: B -> D, from and.left (and.right (and.right (and.right h))),
have given5: C -> D, from and.right (and.right (and.right (and.right h))),
show D, from given4 (given2 given1)

我想我已经把问题包装好,然后再把它拆开,有人能给我展示一个更好的方法来表达这个问题吗?

我认为不使用和在假设中使用->会更清楚。这里有两个等价的证明,我更喜欢第一个

def s2p3 {A B C D : Prop} (ha : A)
      (hab : A -> B) (hac : A -> C)
      (hbd : B -> D) (hcd : C -> D) : D
  := show D, from (hbd (hab ha))
第二个与第一个相同,只是使用了示例, 我相信您必须使用假定指定参数的名称 而不是在声明中

example : A -> (A -> B) -> (A -> C) -> (B -> D) -> (C -> D) -> D :=
assume ha : A,
assume hab : A -> B,
assume hac, -- You can actually just leave the types off the above 2
assume hbd, 
assume hcd,
show D, from (hbd (hab ha))
如果您想使用def语法,但问题是使用示例语法指定的

example : A -> (A -> B) -> (A -> C)
            -> (B -> D) -> (C -> D) -> D := s2p3 
此外,在使用和验证时,在拆包阶段 你拆开given3和Given5的包装,但绝不在你的证明中使用它们。 所以你不需要把它们拆开

example : (( A    )
    /\     ( A->B )
    /\     ( A->C )
    /\     ( B->D )
    /\     ( C->D ))
-> D :=
assume h,
have given1: A, from and.left h,
have given2: A -> B, from and.left (and.right h),
have given4: B -> D, from and.left (and.right (and.right (and.right h))),
show D, from given4 (given2 given1)

请注意,如果用example替换def s2p3,您的第一个证明仍然有效。确实如此,出于某种原因,我从未意识到示例可以采用h:A:A命名参数语法,谢谢!