簡體   English   中英

當目標是類型時,為什么 Coq 不允許反轉、破壞等?

[英]Why Coq doesn't allow inversion, destruct, etc. when the goal is a Type?

refine程序時,當目標是Type時,我嘗試通過對False假設進行inversion來結束證明。 這是我嘗試做的證明的簡化版本。

Lemma strange1: forall T:Type, 0>0 -> T.
  intros T H.
  inversion H.  (* Coq refuses inversion on 'H : 0 > 0' *)

Coq 抱怨

Error: Inversion would require case analysis on sort 
Type which is not allowed for inductive definition le

但是,由於我對T什么都不做,所以沒關系,...或 ?

我像這樣擺脫了T ,證明通過了:

Lemma ex_falso: forall T:Type, False -> T.
  inversion 1.
Qed.  

Lemma strange2: forall T:Type, 0>0 -> T.
  intros T H.
  apply ex_falso.  (* this changes the goal to 'False' *)
  inversion H.
Qed.

Coq 抱怨的原因是什么? 僅僅是inversiondestruct等方面的缺陷嗎?

我之前從未見過這個問題,但這是有道理的,盡管人們可能會認為這是一個inversion的錯誤。

這個問題是由於案例分析實現了inversion 在勒柯克的邏輯,不能在一般邏輯假設,進行案例分析(即東西,它的類型是Prop ),如果結果是計算的性質(的東西即如果排序返回的東西的類型是一個Type )。 這樣做的一個原因是Coq的設計者希望能夠在以一種合理的方式將代碼提取到代碼中時從程序中刪除證明參數:因此,只允許對假設進行案例分析以產生計算的東西,如果被破壞的東西不能改變結果。 這包括:

  1. 沒有構造函數的命題,例如False
  2. 只有一個構造函數的命題,只要該構造函數不帶有計算性質的參數。 這包括TrueAcc (用於做有充分理由的遞歸的可訪問性),但不包括存在量詞ex

然而,正如您所注意到的那樣,通過將您想要用於生成結果的某個命題轉換為另一個可以直接進行案例分析的命題,可以規避該規則。 因此,如果你有一個相互矛盾的假設,就像在你的情況下,你可以先用它來證明False (這是允許的,因為False是一個Prop ), 然后消除False來產生你的結果(這是上述規則所允許的) )。

在您的示例中, inversion過於保守,因為它無法對該上下文中0 < 0類型的事物進行案例分析。 確實,它不能直接通過邏輯規則對其進行案例分析,如上所述; 然而,人們可以想到做一個稍微聰明的inversion實現,認識到我們正在消除一個矛盾的假設,並將False作為中間步驟添加,就像你一樣。 不幸的是,似乎我們需要手動完成這個技巧才能使其發揮作用。

除了 Arthur 的回答之外,還有一個使用constructive_defined_description公理的解決方法。 在函數中使用這個公理將不允許執行計算並從中提取代碼,但它仍然可以用於其他證明:

From Coq Require Import Description.

Definition strange1: forall T:Type, 0>0 -> T.
  intros T H.
  assert (exists! t:T, True) as H0 by inversion H.
  apply constructive_definite_description in H0.
  destruct H0 as [x ?].
  exact x.
Defined.

或無校樣編輯模式的相同功能:

Definition strange2 (T: Type) (H: 0 > 0): T :=
  proj1_sig (constructive_definite_description (fun _ => True) ltac: (inversion H)).

還有一個更強的公理constructive_indefinite_description ,它將命題exists x:T, P x (沒有唯一性) 轉換為相應的sigma-type {x:T | P x} {x:T | P x}

暫無
暫無

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

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