【发布时间】:2019-04-27 10:00:45
【问题描述】:
以下示例来自软件基础一书的 Poly 章节。
Definition fold_length {X : Type} (l : list X) : nat :=
fold (fun _ n => S n) l 0.
Theorem fold_length_correct : forall X (l : list X),
fold_length l = length l.
Proof.
intros.
induction l.
- simpl. reflexivity.
- simpl.
1 subgoal
X : Type
x : X
l : list X
IHl : fold_length l = length l
______________________________________(1/1)
fold_length (x :: l) = S (length l)
我希望它可以简化左侧的一个步骤。应该可以的。
Theorem fold_length_correct : forall X (l : list X),
fold_length l = length l.
Proof.
intros.
induction l.
- simpl. reflexivity.
- simpl. rewrite <- IHl. simpl.
1 subgoal
X : Type
x : X
l : list X
IHl : fold_length l = length l
______________________________________(1/1)
fold_length (x :: l) = S (fold_length l)
在运行测试期间,我遇到了simpl 拒绝潜入的问题,但reflexivity 成功了,所以我在这里尝试了同样的事情并且证明成功了。
请注意,在给定目标状态的情况下,人们不会期望自反性通过,但确实如此。在这个例子中,它起作用了,但它确实迫使我按照与我最初打算相反的方向进行重写。
是否可以对simpl 进行更多控制,以实现所需的减少?
【问题讨论】:
-
fold的定义是什么(或者你用的是什么库)? -
很抱歉没有指定它。
fold在我提到的 Poly 章节中定义,与您的答案中的相同(重命名下)。
标签: coq