Coq中命题真/假和布尔值真/假的区别

时间:2021-02-04 09:05:32

标签: coq

布尔值 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 不是数据构造函数 [...]"。事实上,通过检查 TrueFalse 就很清楚了:

Print True.
Print False.
Inductive True : Prop :=  I : True
Inductive False : Prop := 

然而,在这种情况下,我的问题变成了:为什么?如果它们与 true/false 不同,那么它们是什么?具体:

  • 从命题 truefalse 创建布尔值 TrueFalse 而不是将它们合并为一个原始构造的目的是什么?
  • 如果 Prop 版本 True/Falsebool 版本 true/false 的含义不同,那么它们实际上是什么意思,与它们的布尔变量相比,它们应该代表什么?

1 个答案:

答案 0 :(得分:1)

让我回答您提出的不同问题。 首先,在模式匹配中

Definition inv (a: Prop): Prop :=
  match a with
  | False => True
  | True => False
  end.

Coq 告诉你它是多余的,因为它将 FalseTrue 解释为将被绑定的变量。实际上 TrueFalse 无法匹配,因此它假定您打算将变量命名为 TrueFalse。 这段代码相当于

Definition inv (a: Prop): Prop :=
  match a with
  | x => True
  | y => False
  end.

然后你就会明白为什么 y 是多余的:你说匹配任何值到 True 和任何值到 False


我认为您最大的困惑是认为 TrueFalse 应该以某种方式与 truefalse 具有相同的含义。简短的回答是:除了名字之外,根本没有任何关系。

实际上,TrueFalsebooltrue 更接近于 false:它们是(数据)类型。 True 是只包含一个元素的类型,False 是空类型,没有居民。

Inductive True : Prop :=
| I : True.

Inductive False : Prop :=.

(诚然,False 的定义可能有点奇怪,但它确实表示它是一种没有构造函数的类型。)

相比之下,bool 是具有两个元素的类型:truefalse。 因此,您可以拥有 h : True,它是 True 的证明,但不是 x : true,因为 true 不是类型,而是一段数据。

可以观察数据(模式匹配),但不能观察数据类型。

我真的想坚持truefalse不是TrueFalse变体truefalse 只是一点点,除了你如何使用它们之外没有任何意义。另一方面,TrueFalse 具有非常精确的含义。 True 是总是可证明的微不足道的命题,而 False 是永远不可证明的命题,有 h : False 表示矛盾。

False 的消除原理展示了如何使用它:

False_rect : ∀ P : Type, False → P

它说你可以从False的证明中推导出任何东西