Coq中命题真/假与布尔真/假的区别
布尔值Coq中命题真/假与布尔真/假的区别,coq,Coq,布尔值真/假的定义及其与命题类型真/假的联系如所述: 谈到bool类型,我或多或少了解它们的用途和功能,但Prop类型并非如此。这是我困惑的一个很好的例子。如图所示,以下定义无效: 导致“模式”True”在本子句中是多余的。”。另一方面,与bool类型相同的定义可以很好地编译: Definition inv (a: bool): bool := match a with | false => true | true => false end. 从模式匹配的角度很好地
真
/假
的定义及其与命题类型真
/假
的联系如所述:
谈到bool
类型,我或多或少了解它们的用途和功能,但Prop
类型并非如此。这是我困惑的一个很好的例子。如图所示,以下定义无效:
导致“模式”True”在本子句中是多余的。
”。另一方面,与bool
类型相同的定义可以很好地编译:
Definition inv (a: bool): bool :=
match a with
| false => true
| true => false
end.
从模式匹配的角度很好地解释了为什么会发生这种情况:“False
不是数据构造函数[…]”。事实上,通过检查True
和False
,这一点是清楚的:
Print True.
Print False.
然而,在这种情况下,我的问题变成:为什么?如果它们与true
/false
不同,那么它们是什么?具体而言:
- 从命题的
和true
创建布尔值false
和true
的目的是什么,而不是将它们合并到一个基本构造中false
- 如果
versionsProp
/True
与False
versionsbool
/True
的含义不同,那么它们的实际含义是什么?与布尔变量相比,它们应该表示什么False
- 让我回答你的不同问题。
首先,在模式匹配中
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
比True
和False
更接近bool
:它们是(数据)类型。
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
只是位,除了如何使用它们之外,它们实际上没有任何意义<另一方面,code>True和False
具有非常精确的含义True
是始终可证明的平凡命题,False
是永远不可证明的命题,具有h:False
表示矛盾
False
的消除原则说明了如何使用它:
False_rect : ∀ P : Type, False → P
它说你可以从
False
的证明中得到任何东西。这个问题可能有用:。它激发了bool和Prop之间的差异。
Definition inv (a: Prop): Prop :=
match a with
| x => True
| y => False
end.
Inductive True : Prop :=
| I : True.
Inductive False : Prop :=.
False_rect : ∀ P : Type, False → P