Coq 匹配中的冗余子句

Coq 匹配中的冗余子句,coq,Coq,当我运行以下脚本时: Definition inv (a: Prop): Prop := match a with | False => True | True => False end. 我得到“错误:这个子句是多余的。”你知道为什么会这样吗 谢谢, 马库斯。关于这一点,有很多错误的地方 False不是一个数据构造函数,因为Coq中的数据构造函数和变量名之间没有语法上的差异,所以它将您的|False=>理解为一个匹配任何内容的模式,并将其命名为False,方法与您可以编写的相同:

当我运行以下脚本时:

Definition inv (a: Prop): Prop :=
match a with
| False => True
| True => False
end.
我得到“错误:这个子句是多余的。”你知道为什么会这样吗

谢谢,
马库斯。

关于这一点,有很多错误的地方

False
不是一个数据构造函数,因为Coq中的数据构造函数和变量名之间没有语法上的差异,所以它将您的
|False=>
理解为一个匹配任何内容的模式,并将其命名为
False
,方法与您可以编写的相同:

Definition inv (a: Prop): Prop :=
  match a with
  | x => True
  | y => False
  end.
这就是为什么它告诉您第二个子句是多余的(因为第一个模式匹配所有内容)

现在您应该知道的另一件事是,类型
Prop
不是归纳定义的,因此类型
Prop
的值不能与任何东西匹配:事实上,这没有意义,因为它是一个开放类型,每次定义新的归纳属性时都会不断扩展


因此,没有办法按照您编写函数的方式编写函数
inv

但是,您可以编写
定义inv(a:Prop):Prop:=a->False
,其含义类似。