在coq中逐步简化?

sav*_*ava 10 coq

有没有办法一次简化一步?

假设您f1 (f2 x)可以通过单一依次简化这两者simpl,是否可以简化f2 x作为第一步,检查中间结果然后简化f1

以例如定理为例:

Theorem pred_length : forall n : nat, forall l : list nat,
  pred (length (n :: l)) = length l.
Proof.
  intros.
  simpl.
  reflexivity.
Qed.
Run Code Online (Sandbox Code Playgroud)

simpl战术简化Nat.pred (length (n :: l))length l.有没有办法将其分解为两步简化,即:

Nat.pred (length (n :: l)) --> Nat.pred (S (length l)) --> length l
Run Code Online (Sandbox Code Playgroud)

ich*_*ame 12

您还可以使用simpl特定模式.

Theorem pred_length : forall n : nat, forall l : list nat,
  pred (length (n :: l)) = length l.
Proof.
 intros.
 simpl length.
 simpl pred.
 reflexivity.
Qed.
Run Code Online (Sandbox Code Playgroud)

如果您有多次出现的模式length可以简化,您可以通过给出该事件的位置(从左到右),例如simpl length at 1simpl length at 2第一次或第二次出现,进一步限制简化的结果.


Ant*_*nov 5

我们可以关闭简化pred,简化它的参数并重新打开它:

Theorem pred_length : forall n : nat, forall l : list nat,
  pred (length (n :: l)) = length l.
Proof.
  intros.
  Arguments pred : simpl never.    (* do not unfold pred *)
  simpl.
  Arguments pred : simpl nomatch.  (* unfold if extra simplification is possible *)
  simpl.
  reflexivity.
Qed.
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅参考手册的第8.7.4 节

  • @Savvas Savvides 感谢您接受我的回答,但让我*恭敬地* 建议您不要过早接受答案,因为这可能会阻止一些用户提供我们都感兴趣的他们自己的高质量答案。最好是等待至少 24 小时。祝你有美好的一天,祝你好运:) (2认同)