为什么无法在Coq中使用抽象值来评估修复定义的表达式?

时间:2015-07-24 07:46:48

标签: coq

我需要证明一个定理:

Theorem t : forall x, (fix f (n : nat) : nat := n) x = x.

非正式的证明就像

一样简单
f is an identity function. So the result is the same as the input.

如果我在simpl之后使用intro x,则不会发生任何变化。 Coq没有尝试用抽象值x来评估fix-function。但是如果我对x进行归纳分析,Coq会自动评估等式的左侧并将其减少到0S x

为什么Coq禁止用抽象值x?

来评估修复函数

1 个答案:

答案 0 :(得分:6)

boolean isEmpty = head == tail; if (!isEmpty) { Item tmp = array[--head]; array[head] = null; return tmp; } throw new NoSuchElementException("Stack underflow"); (以及所有其他计算策略)应用转换规则。由于您的目标是平等的,因此如果您的条款可兑换,则可以直接使用simpl。但reflexivity(fix f (n : nat) : nat := n) x不可转换。

减少x的规则是iota转换。它在manual(第4章“归纳构造的微积分”,§4.5.5“定点定义”,“缩减规则”下)中有所描述。缩减规则要求参数以构造函数开头。通常,这需要确保终止。手册中有一个与你的相似的例子:

  

以下不是转换,但可以在案例后证明   分析

fix

您要证明的平等实际上是某种形式的延伸性。 Coq没有扩展性作为原始规则,它可以在类型是显式时派生。破坏显式Coq < Goal forall t:tree, sizet t = S (sizef (sont t)). Coq < Coq < 1 subgoal ============================ forall t : tree, sizet t = S (sizef (sont t)) Coq < reflexivity. (** this one fails **) Toplevel input, characters 0-11: > reflexivity. > ^^^^^^^^^^^ Error: Impossible to unify "S (sizef (sont t))" with "sizet t". Coq < destruct t. 1 subgoal f : forest ============================ sizet (node f) = S (sizef (sont (node f))) Coq < reflexivity. No more subgoals. 参数就是这样做的:让你证明这个扩展性属性。在Coq开发中证明这种扩展性引理是相当普遍的。

nat