[英]Logic: auxilliry lemma for tr_rev_correct
在Logic章節中,引入了反向列表函數的尾遞歸版本。 我們需要證明它正常工作:
Fixpoint rev_append {X} (l1 l2 : list X) : list X :=
match l1 with
| [] => l2
| x :: l1' => rev_append l1' (x :: l2)
end.
(* Tail recursion rev *)
Definition tr_rev {X} (l : list X) : list X :=
rev_append l [].
但在證明之前,我想證明一個引理:
Lemma rev_append_app: forall (X: Type) (x: X) (l : list X),
rev_append l [x] = rev_append l [] ++ [x].
Proof.
intros X x l. induction l as [| h t IH].
- simpl. reflexivity.
- simpl.
我被困在這里:
X : Type
x, h : X
t : list X
IH : rev_append t [x] = rev_append t [ ] ++ [x]
============================
rev_append t [h; x] = rev_append t [h] ++ [x]
接下來做什么?
正如您在嘗試證明時所注意到的那樣,當從rev_append l [x]
到rev_append (h :: t) [x]
進行歸納步驟時,最終會得到術語rev_append t [h; x]
rev_append t [h; x]
簡化后。 歸納步驟不會導致rev_append
函數的基本情況,而是導致您無法簡化的另一個遞歸調用。
注意你想要應用的歸納假設如何對某些固定的x
做一個關於rev_append t [x]
的陳述,但是在你的目標中,額外的h
list元素在它被rev_append t [x]
之前,並且歸納假設是沒有用的。
這就是當說明你的歸納假設不夠強大時,Bubbler的答案所指的是:它只是對第二個參數是一個包含單個元素的列表的情況做出了陳述。 但即使只是在歸納步驟(一個遞歸應用程序)之后,該列表已經至少有兩個元素!
正如Bubbler所建議的那樣,輔助引理rev_append l (l1 ++ l2) = rev_append l l1 ++ l2
更強,並且沒有這個問題:當用作歸納假設時,它可以應用於rev_append t [h; x]
rev_append t [h; x]
同樣,允許你用rev_append t [h] ++ [x]
證明相等。
當試圖證明幫助引理時,你可能會像證明rev_append_app
本身一樣被卡住(就像我做的那樣)。 幫助我繼續進行的關鍵建議是在開始歸納之前要小心你引入的哪些普遍量化的變量 。 如果你過早地專注於它們中的任何一個,你可能會削弱你的歸納假設並再次陷入困境。 您可能需要更改這些量化變量的順序或使用generalize dependent
策略(請參閱Logic Foundations的Tactics章節)。
您可以看到歸納假設IH
不足以證明目標。 在這里你需要的是一個更一般的聲明,首先要證明 。 您可以在此處找到更多專門針對此主題的練習。 (實際上,尾遞歸反轉是練習之一。)
在您的情況下,完全一般化的陳述可以如下:
Lemma rev_append_app': forall (X: Type) (l l1 l2 : list X),
rev_append l (l1 ++ l2) = rev_append l l1 ++ l2.
通過歸納證明這一點是微不足道的。 然后你可以證明你自己的陳述是這個的必然結果:
Corollary rev_append_app: forall (X: Type) (x: X) (l : list X),
rev_append l [x] = rev_append l [] ++ [x].
Proof. intros. apply (rev_append_app _ _ [] [x]). Qed.
使用像這樣的泛化依賴策略:
Lemma rev_append_app: forall (X: Type) (l l1: list X) (x : X),
rev_append l (l1 ++ [x]) = rev_append l l1 ++ [x].
intros.
generalize dependent l1.
induction l as [| h t IH].
- intros.
easy.
- intros.
apply (IH (h::l1)).
Qed.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.