我正在寻找软件基础。给出了列表反转函数的两种定义。
Fixpoint rev (l:natlist) : natlist :=
match l with
| nil => nil
| h :: t => rev t ++ [h]
end.
和一个尾递归的:
Fixpoint rev_append {X} (l1 l2 : list X) : list X :=
match l1 with
| [] => l2
| x :: l1' => rev_append l1' (x :: l2)
end.
Definition tr_rev {X} (l : list X) : list X :=
rev_append l [].
这是问题到来的地方。我被要求证明他们的平等,并提出以下定理:Lemma tr_rev_correct : ∀X, @tr_rev X = @rev X.
这会生成以下证明状态:
1 subgoal
______________________________________(1/1)
forall X : Type, tr_rev = rev
但是,即使我unfold
tr_rev
(和/或其他两个定义),我最终会得到以下内容:
1 subgoal
______________________________________(1/1)
forall X : Type, (fun l : list X => rev_append l [ ]) = rev
但我不能对这个表述做任何事情(intro X
除外)。
我想要的是:
Lemma tr_rev_correct : forall (X : Type) (l : list X), tr_rev l = rev l.
有没有办法用后者替换前者而不涉及功能性扩展? (如果我不想重述本书给出的引理。)