我尝试了以下证明,
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
我也遇到了一些类似的案例,以获取列表上的其他证明。 我不知道通常的归纳方法在这里是否有用。
我应该如何证明这一点? 我应该使用归纳法吗?
答案 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
时进行递归调用。
此外,如果您觉得归纳假设还不够笼统,那可能是因为intros
和induction
的顺序是错误的。经验法则是先从induction
开始证明,然后从intros
变量开始。如果还不够,您可以revert dependent
(除了一个变量之外的所有变量)进行归纳,然后induction x; intros
。