[英]Destruct hypothesis: general case
如果H
包含合取或析取,那么destruct H
的作用就很清楚了。 但我無法弄清楚它在一般情況下的作用。 它做了一些奇怪的事情,特別是如果H: a -> b
。
一些例子:
Lemma demo : forall (x y: nat), x=4 -> x=4.
Proof.
intros. destruct H.
假設剛剛被破壞:
1 subgoal
x, y : nat
______________________________________(1/1)
x = x
另一個:
Lemma demo : forall (x y: nat), (x = 4 -> x=4) -> True.
Proof.
intros. destruct H.
現在我有兩個分支:
1 subgoal
x, y : nat
______________________________________(1/1)
x = 4
1 subgoal
x, y : nat
______________________________________(1/1)
True
第三個例子。 這無法證明,但對我來說仍然沒有意義:
Lemma demo : forall (x y: nat), (x = 4 -> x = 4) -> x = 4.
Proof.
intros. destruct H.
現在我必須在第二個分支中證明x = x
!
2 subgoals
x, y : nat
______________________________________(1/2)
x = 4
______________________________________(2/2)
x = x
所以,我顯然不明白destruct H
的作用。
你提到的案例分為兩類。 如果H: A
和A
是歸納或共歸納定義的(例如,合取和析取),則destruct H
為該類型中的每個構造函數生成一個子目標,附加假設由該構造函數的 arguments 確定。 另一方面,如果H: A -> B
,則destruct H
生成一個子目標,您必須在其中證明A
,然后遞歸地繼續,就好像H: B
一樣。 這大致相當於以下調用:
assert (H' : A); [ |specialize (H H'); destruct H].
難題的缺失部分是相等性本身被定義為歸納類型:
Inductive eq (A : Type) (a : A) : A -> Prop :=
| eq_refl : eq A a a
當您析構x = 4
類型的東西時,Coq 會為該類型的每個構造函數生成一個 case。 但是該類型中只有一個構造函數: eq_refl
。 在考慮這種情況時,Coq 還會自動用 LHS 替換破壞相等的 RHS 的出現(因為對於該構造函數,兩邊都是相等的)。 在您的第一個和第三個示例中,這導致將目標中的 4 替換為x
。
大多數時候,您不想破壞相等假設,因為這種替換行為不是很有用。 通常最好使用rewrite
策略,因為它允許您從右到左或從左到右重寫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.