我需要证明一个定理:
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会自动评估等式的左侧并将其减少到0
和S x
。
为什么Coq禁止用抽象值x?
来评估修复函数答案 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