[英]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.