布尔值 true
/false
的定义及其与命题类型 True
/False
的链接在 Coq.Bool.Bool 中描述:
Inductive bool : Set := true : bool | false : bool
Definition Is_true (b:bool) :=
match b with
| true => True
| false => False
end.
说到 bool
类型,我或多或少了解它们的用途和功能,但 Prop
类型并非如此。 This question 很好地说明了我的困惑。如此处所述,以下定义无效:
Definition inv (a: Prop): Prop :=
match a with
| False => True
| True => False
end.
结果为“Pattern "True" is redundant in this clause.
”。另一方面,bool
类型的相同定义编译良好:
Definition inv (a: bool): bool :=
match a with
| false => true
| true => false
end.
Ptival's answer 很好地解释了为什么在模式匹配意义上会发生这种情况:"False
不是数据构造函数 [...]"。事实上,通过检查 True
和 False
就很清楚了:
Print True.
Print False.
Inductive True : Prop := I : True
Inductive False : Prop :=
然而,在这种情况下,我的问题变成了:为什么?如果它们与 true
/false
不同,那么它们是什么?具体:
true
和 false
创建布尔值 True
和 False
而不是将它们合并为一个原始构造的目的是什么?Prop
版本 True
/False
与 bool
版本 true
/false
的含义不同,那么它们实际上是什么意思,与它们的布尔变量相比,它们应该代表什么?答案 0 :(得分:1)
让我回答您提出的不同问题。 首先,在模式匹配中
Definition inv (a: Prop): Prop :=
match a with
| False => True
| True => False
end.
Coq 告诉你它是多余的,因为它将 False
和 True
解释为将被绑定的变量。实际上 True
和 False
无法匹配,因此它假定您打算将变量命名为 True
或 False
。
这段代码相当于
Definition inv (a: Prop): Prop :=
match a with
| x => True
| y => False
end.
然后你就会明白为什么 y
是多余的:你说匹配任何值到 True
和任何值到 False
。
我认为您最大的困惑是认为 True
和 False
应该以某种方式与 true
和 false
具有相同的含义。简短的回答是:除了名字之外,根本没有任何关系。
实际上,True
和 False
比 bool
和 true
更接近于 false
:它们是(数据)类型。
True
是只包含一个元素的类型,False
是空类型,没有居民。
Inductive True : Prop :=
| I : True.
Inductive False : Prop :=.
(诚然,False
的定义可能有点奇怪,但它确实表示它是一种没有构造函数的类型。)
相比之下,bool
是具有两个元素的类型:true
和 false
。
因此,您可以拥有 h : True
,它是 True
的证明,但不是 x : true
,因为 true
不是类型,而是一段数据。
可以观察数据(模式匹配),但不能观察数据类型。
我真的想坚持true
和false
不是True
和False
的变体。 true
和 false
只是一点点,除了你如何使用它们之外没有任何意义。另一方面,True
和 False
具有非常精确的含义。 True
是总是可证明的微不足道的命题,而 False
是永远不可证明的命题,有 h : False
表示矛盾。
False
的消除原理展示了如何使用它:
False_rect : ∀ P : Type, False → P
它说你可以从False
的证明中推导出任何东西。