簡體   English   中英

破壞假設:一般情況

[英]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: AA是歸納或共歸納定義的(例如,合取和析取),則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.

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