【发布时间】:2021-02-04 09:05:32
【问题描述】:
布尔值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的含义不同,那么它们的实际含义是什么以及它们应该代表什么与它们的布尔变量相比?
【问题讨论】:
-
这个问题可能有用:stackoverflow.com/q/31554453/1633770。它激发了 bool 和 Prop 之间的差异。
标签: coq