定理中命题的大括号和大括号之间的区别

时间:2019-04-23 09:31:55

标签: lean

我对定理中的命题使用花括号感到非常困惑。请参阅以下四个代码段:

theorem contrapositive_1 : ∀ (P Q : Prop),
  (P -> Q) -> (¬ Q -> ¬ P) := sorry

theorem contrapositive_2 (P Q : Prop) : 
  (P -> Q) -> (¬ Q -> ¬ P) := sorry

theorem contrapositive_3 : ∀ {P Q : Prop},
  (P -> Q) -> (¬ Q -> ¬ P) := sorry

theorem contrapositive_4 {P Q : Prop} : 
  (P -> Q) -> (¬ Q -> ¬ P) := sorry

我以为它们都是相同的,但显然它们不是一样的,因为当我想在另一个定理的证明中使用contraprositive_1contraprositive_2时,lean显示了一个错误类型不匹配:

  

项h1的类型为P→Q:Prop,但预计其类型为Prop:类型

另一方面,contraprositive_3contraprositive_4可以正常工作。

大括号和大括号有什么区别?

1 个答案:

答案 0 :(得分:1)

区别在于参数是显式()还是隐式{}。通常,您希望参数是显式的,除非可以从以后出现的参数中找出它们。例如

lemma foobar {X : Type} (x : X) : x = x := sorry

在这种情况下,X是隐式的,因为一旦您向Lean讲解x,它便可以找出X本身(它是x的类型)。换句话说,如果要将引理应用于y : Y,则只需编写foobar y。 如果相反,你会做

lemma quux (X : Type) (x : X) : x = x := sorry

您必须将其称为quux Y y

如果在名称前放置@,则会将所有隐式参数转换为显式参数。因此,您可以致电@foobar Y y。 “相反”,如果您希望精益本身自己找出Y,则可以写一个下划线:quux _ y

TPIL中的相关部分:https://leanprover.github.io/theorem_proving_in_lean/dependent_type_theory.html#implicit-arguments