在Coq中,假設我有一個定點函數f
,它的匹配定義(g x
)和我想在證明中使用形式(g x = ...
)的假設。下面是一個最小的工作示例(在現實中f
,g
會比較複雜):重寫Coq中的匹配
Definition g (x:nat) := x.
Fixpoint f (x:nat) :=
match g x with
| O => O
| S y => match x with
| O => S O
| S z => f z
end
end.
Lemma test : forall (x : nat), g x = O -> f x = O.
Proof.
intros.
unfold f.
rewrite H. (*fails*)
消息顯示,其中勒柯克卡:
(fix f (x0 : nat) : nat :=
match g x0 with
| 0 => 0
| S _ => match x0 with
| 0 => 1
| S z0 => f z0
end
end) x = 0
Error: Found no subterm matching "g x" in the current goal.
但是,命令unfold f. rewrite H.
不起作用。
如何獲取Coq到unfold f
然後使用H
?
的問題是,勒柯克的''SIMPL ''(比如'unfold,cbv,...'')通常都太急於簡化和展開太多。用一個非常簡單的證明完全按照你所需要的(''funroll'')說明重寫引理,並且使用這個引理有點複雜,但總的來說會產生更好的結果。 – Vinz 2015-02-09 11:03:37