在Coq中,我遇到了在以下情况下应用rewrite
策略的问题:
Section Test.
Hypothesis s t : nat -> nat.
Hypothesis s_ext_eq_t : forall (x : nat), s x = t x.
Definition dummy_s : nat -> nat :=
fun n => match n with
| O => 42
| S np => s np
end.
Definition dummy_t : nat -> nat :=
fun n => match n with
| O => 42
| S np => t np
end.
Goal forall (n : nat), dummy_s n = dummy_t n.
Proof.
intro n. unfold dummy_s. unfold dummy_t.
在该阶段,当地背景和当前目标如下:
1 subgoals, subgoal 1 (ID 6)
s : nat -> nat
t : nat -> nat
s_ext_eq_t : forall x : nat, s x = t x
n : nat
============================
match n with
| 0 => 42
| S np => s np
end = match n with
| 0 => 42
| S np => t np
end
现在应该可以应用rewrite
策略来s np
替换目标中t np
的出现,从而可以使用{{1}来解决目标}。然而,
reflexivity
给出
rewrite s_ext_eq_t.
我做错了什么?一个可以通过
进入Toplevel input, characters 0-18:
Error: Found no subterm matching "s ?190" in the current goal.
适用的情况
rewrite
但是在我面临的实际情况中,有几个这样的破坏是必要的,我想知道 destruct n.
(* n = 0 *)
reflexivity.
(* n > 0 *)
rewrite s_ext_eq_t.
reflexivity.
Qed.
或其变体是否能够自动完成。
附录当证明通过有根据的递归定义的函数具有所需的定点属性时,上述情况自然会发生:
假设rewrite
且A: Type
是一个有充分根据的关系,即我们R: A -> A -> Prop
。然后,给定类型族Rwf: well_founded R
,我们可以构建一个部分
P: A -> Type
通过递归Fix : forall (x : A), P a
,递归步骤作为函数
R
请参阅https://coq.inria.fr/library/Coq.Init.Wf.html但是,要显示 F : forall x:A, (forall y:A, R y x -> P y) -> P x
确实具有固定点属性
Fix
我们需要提供证人
forall (x : A), Fix x = F (fun (y:A) _ => Fix y)`
即。我们必须证明 F_ext : forall (x:A) (f g:forall y:A, R y x -> P y),
(forall (y:A) (p:R y x), f y p = g y p) -> F f = F g.
不使用给定F
中的任何其他内容,而是使用其值。当然,在任何具体的情况下,这应该是微不足道的验证,但是当一个人试图证明它时,会遇到一个我在上面提到的最小例子的情况:一个面临两个代码副本的巨大相等性对于递归步骤,一次使用f: forall y:A, R y x -> P y
,另一次使用f
。您的假设表明g
和f
在扩展上是相等的,因此应该能够重写它们。但是,在递归步骤的代码中,可能存在大量的模式匹配和新变量,这些变量在本地上下文中没有意义,因此g
数十个(不必要地)是非常繁琐的允许申请destruct
之前的时间。
答案 0 :(得分:4)
正如上面的评论所述, 可能直接在match
语句的分支上执行重写,因为np
不在范围内顶级环境。就Coq的理论而言,你的陈述的证明必须在某些时候毁掉n
。
虽然我不知道有任何自动化这类问题的策略,但是在没有太多痛苦的情况下提出一些自定义的ltac代码来解决你的问题并不是很难:
Ltac solve_eq :=
try reflexivity;
match goal with
| |- match ?x with _ => _ end
= match ?x with _ => _ end =>
destruct x; auto
end.
Goal forall (n : nat), dummy_s n = dummy_t n.
Proof.
intro n. unfold dummy_s. unfold dummy_t.
solve_eq.
Qed.
如果您的扩展相等结果是出现在您的上下文中的假设,那么solve_eq
应该能够解决这种形状的许多目标;如果没有,您可能需要在提示数据库中添加额外的引号。