簡體   English   中英

在Coq中證明“ rev(rev l)= l”

[英]Prove “rev (rev l) = l” in Coq

這是給我的練習之一,我對l進行歸納后幾乎立即陷入困境。 我不知道在這里還有什么其他主張。

我不允許使用自動,直覺等高級策略。

Fixpoint snoc {A : Type} l a : list A :=

match l with

  | nil    => a :: nil

  | h :: t => h :: (snoc t a)

end.

Fixpoint rev {A : Type} l : list A :=

match l with

  | nil    => nil

  | h :: t => snoc (rev t) h

end.

(Prove the following)

Theorem rev_rev : forall A (l : list A),

rev (rev l) = l.

我們都是新來的人,從一開始就尋求幫助,以免在嘗試掌握新主題時陷入失敗的勇氣。 我會盡力給您一些提示。

之所以比以前的練習更棘手,可能是因為該證明涉及兩個歸納推理步驟。 您可能第一個目標就做得不錯,而第二個目標是

  ...
  IHl : rev (rev l) = l
  ============================
   rev (snoc (rev l) a) = a :: l

不幸的是,您不能立即使用歸納假設IHl ,因為rev的參數形式不正確。

因此,在這里您可以嘗試證明關於rev (snoc la) = ... 另一個引理,它將把目標變成可以用IHl重寫的IHl
如果您能弄清楚這一點,並證明它在引理中,那么您應該可以。

我們不會為您做家庭作業,您首先應該像@gallais所說的那樣在紙筆上證明它。

提示:您可能需要稍微概括一下屬性(使用中間引理)才能證明rev_rev 您應該看看rev_append

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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