我对定理中的命题使用花括号感到非常困惑。请参阅以下四个代码段:
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_1
和contraprositive_2
时,lean
显示了一个错误类型不匹配:
项h1的类型为P→Q:Prop,但预计其类型为Prop:类型
另一方面,contraprositive_3
和contraprositive_4
可以正常工作。
大括号和大括号有什么区别?
答案 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