在Coq中重用lambda而没有扩展函数相等?

时间:2016-10-07 08:15:30

标签: coq theorem-proving

我正在寻找软件基础。给出了列表反转函数的两种定义。

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.

有没有办法用后者替换前者而不涉及功能性扩展? (如果我不想重述本书给出的引理。)

0 个答案:

没有答案