在coq中逐步简化?

时间:2016-09-06 18:42:20

标签: 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.

以定理为例:

simpl

Nat.pred (length (n :: l))策略将length l简化为Nat.pred (length (n :: l)) --> Nat.pred (S (length l)) --> length l 。有没有办法将其分解为两步简化,即:

SSL_write

2 个答案:

答案 0 :(得分:11)

您还可以将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.

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

答案 1 :(得分:4)

我们可以关闭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.

有关详细信息,请参阅“参考手册”的§8.7.4