我想证明有关列表的一些属性,但被归纳为归纳

时间:2019-07-01 04:29:49

标签: coq

我尝试了以下证明,

Require Import List Omega.
Import ListNotations.
Variable X : Type.

Lemma length_n_nth_app_error_same : forall (n:nat) (x:X) (l:list X),
n <= length l -> 0 < n -> nth_error l n = nth_error (l ++ [x]) n .
Proof.
  intros.
  induction l eqn:eqHl.
  - unfold length in H. omega.
  - 

但是我被困住了,因为我仅有的是

1 subgoal
n : nat
x : X
l : list X
a : X
l0 : list X
eqHl : l = a :: l0
H : n <= length (a :: l0)
H0 : 0 < n
IHl0 : l = l0 ->
       n <= length l0 ->
       nth_error l0 n = nth_error (l0 ++ [x]) n
______________________________________(1/1)
nth_error (a :: l0) n = nth_error ((a :: l0) ++ [x]) n

我也遇到了一些类似的案例,以获取列表上的其他证明。 我不知道通常的归纳方法在这里是否有用。

我应该如何证明这一点? 我应该使用归纳法吗?

1 个答案:

答案 0 :(得分:1)

您的定理是错误的。也许您对nth_error的理解不正确。

具体来说,当n = length l时,nth_error l n返回None,而nth_error (l ++ [x]) n返回Some x

Require Import List Omega.
Import ListNotations.

Lemma length_n_nth_app_error_not_always_same :
  (forall (n:nat) (X:Type) (x:X) (l:list X),
  n <= length l -> 0 < n -> nth_error l n = nth_error (l ++ [x]) n)
  -> False.
Proof.
  intros.
  assert (1 <= 1) by omega. assert (0 < 1) by omega.
  specialize (H 1 nat 2 [1] H0 H1). simpl in H. inversion H. Qed.

另一方面,用固定的不等式证明相似的定理很容易:

Lemma length_n_nth_app_error_same : forall (n:nat) (X:Type) (x:X) (l:list X),
n < length l -> nth_error l n = nth_error (l ++ [x]) n .
Proof.
  induction n; intros.
  - simpl. destruct l; simpl in *.
    + omega.
    + reflexivity.
  - simpl. destruct l; simpl in *.
    + omega.
    + apply IHn. omega. Qed.

请注意,我使用的是induction n而不是induction l。主要是因为nth_error在递减n时进行递归调用。

此外,如果您觉得归纳假设还不够笼统,那可能是因为introsinduction的顺序是错误的。经验法则是先从induction开始证明,然后从intros变量开始。如果还不够,您可以revert dependent(除了一个变量之外的所有变量)进行归纳,然后induction x; intros