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
    的目的是什么,而不是将它们合并到一个基本构造中
  • 如果
    Prop
    versions
    True
    /
    False
    bool
    versions
    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