[英]Lemma about list and rev(list)
試圖證明以下引理使我陷入困境。 關於列表的通常定理是通過歸納法證明的,但我不知道下一步要去哪里。
Lemma reverse_append : forall (T : Type) (h : T) (t : list T), h::t = rev(t) ++ [h] -> t = rev(t).
Proof.
intros. induction t.
- simpl. reflexivity.
- simpl. simpl in H.
Result:
1 subgoal (ID 522)
T : Type
h, x : T
t : list T
H : h :: x :: t = (rev t ++ [x]) ++ [h]
IHt : h :: t = rev t ++ [h] -> t = rev t
============================
x :: t = rev t ++ [x]
在開始證明定理之前,您應該嘗試徹底了解定理的內容。 你的定理是完全錯誤的。
反例: 2 :: [1;2] = rev [1;2] ++ [2]
,但[1;2]
不是回文。
充分證明:
Require Import List.
Import ListNotations.
Lemma reverse_append_false :
~(forall (T : Type) (h : T) (t : list T), h::t = rev(t) ++ [h] -> t = rev(t)).
Proof. intros H. specialize (H nat 2 [1;2] eq_refl). inversion H. Qed.
rev(t)
應該只是rev t
。 這只是一個審美觀點,但是您可能應該使自己更加熟悉以函數式編程風格進行編寫。
通常,關於列表的定理是通過歸納法證明的
盡管從技術上講是正確的,但這是一個非常幼稚的聲明。 對價值進行歸納的方法有很多,選擇最有效的歸納是一項關鍵技能。 僅舉幾例:
引理並非如此。 在證明任何東西之前,您應該確保它有意義。 該假設實質上是在說h::t = rev (h::t)
。 但是,為什么這意味着t = rev t
? 如果您從回文列表的開頭刪除某個元素,則它可能不再是回文。 例如,神化是回文('deified'= rev'deified'),但神化不是回文。
例如,在這種特定情況下,為1::[2; 1] = (rev [2; 1]) ++ [1]
1::[2; 1] = (rev [2; 1]) ++ [1]
,因為兩者均為[1; 2; 1]
[1; 2; 1]
[1; 2; 1]
。 但是[2; 1]
[2; 1]
不等於rev [2; 1] = [1; 2]
rev [2; 1] = [1; 2]
rev [2; 1] = [1; 2]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.