匹配中的冗余子句

时间:2014-11-19 22:35:49

标签: coq

当我运行以下脚本时:

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

我得到"错误:这个条款是多余的。"知道为什么会这样吗?

谢谢, 马库斯。

1 个答案:

答案 0 :(得分:6)

这有很多错误。

False不是数据构造函数,并且由于Coq中的数据构造函数和变量名之间没有语法差异,因此它将| False =>理解为匹配任何内容的模式,并将其命名为{{ 1}},就像你写的一样:

False

这就是为什么它告诉你第二个子句是多余的(因为第一个模式匹配所有东西)。

现在你要知道的另一件事是Definition inv (a: Prop): Prop := match a with | x => True | y => False end. 类型没有归纳定义,因此类型Prop的值不能与任何东西匹配:事实上它没有意义,因为它是一种开放式类型,每次定义新的归纳属性时都会不断扩展。

因此无法按照编写函数的方式编写函数Prop