簡體   English   中英

關於列表和轉速的引理(列表)

[英]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 這只是一個審美觀點,但是您可能應該使自己更加熟悉以函數式編程風格進行編寫。

通常,關於列表的定理是通過歸納法證明的

盡管從技術上講是正確的,但這是一個非常幼稚的聲明。 對價值進行歸納的方法有很多,選擇最有效的歸納是一項關鍵技能。 僅舉幾例:

  • 上榜歸納
  • 清單長度的歸納
    • 在處理rev和其他保留長度的函數時經常出現
  • 如果簡單歸納法不起作用,請考慮定制歸納方案

引理並非如此。 在證明任何東西之前,您應該確保它有意義。 該假設實質上是在說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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM