[英]Coq: goal is just a type (when using theorems with unnecessary arguments)
我在 Coq 中發現了一個奇怪的怪癖。 當你有一個帶有不必要的 arguments 的定理時,就會發生這種情況,我們使用這個定理進行rewrite
。 例如,考慮以下代碼片段。
Theorem foo : forall (k : nat) (x : bool), k=0+k.
Proof. reflexivity. Qed.
Theorem bar : forall (k : nat), 0+k=k.
Proof.
intros k. rewrite foo. reflexivity.
(* At this point, the goal is just "bool"! *)
Abort.
在此示例中, foo
有一個冗余參數x
。 然后,當我在bar
的證明中使用rewrite foo
時,它會生成一個只讀為“ bool
”的目標。
我的第一個問題是:為什么會產生這樣一個目標?
其次,我發現這個目標可以使用assumption
策略來完成。 但是,這並沒有真正說明目標是如何解決的。 還有什么其他策略可以用來完成這樣的目標?
目標bool
在您應用rewrite foo.
戰術。 此時,您要求 Coq 找到表達式ek: nat
和ex: bool
,以便foo ek ex
的左側出現在目標中。 使用合一,Coq 推斷出ek:= k
是一個合理的選擇,但它沒有獲得ex
的任何信息,因為變量x
沒有出現在foo
的陪域中。 因此它創建了一個新目標,以便您作為用戶可以填充foo
缺少的參數。
現在,由於該參數實際上未被使用,您可以通過多種方式實現該目標:您可以提供一個具體的 boolean exact true.
或exact false
,將其留給自動化constructor.
或使用您在上下文中擁有的任何 boolean (實際上我對假設的行為感到有點驚訝是您的上下文已關閉,如您的示例所示)。
您還可以在 Coq 使用rewrite (foo k true).
例如。
kyo 很好地回答了您的問題,但我記得對此感到困惑,所以這里有一些額外的背景信息:
在 Coq 中,說X
成立(例如,它是一個目標,現在它被證明了)等同於說存在一個X
類型的項(即, X
是有人居住的)。 當X
恰好是一個邏輯公式時(即當X: Prop
時),我們希望找到它作為目標並使用策略來證明它。 當X
碰巧是其他任何東西時(例如, bool
),我們希望找到它作為一個術語並在定義中使用它。 但是,沒有什么能阻止您在定義中使用邏輯公式(通常導致依賴類型),通過顯式提供證明而不是使用策略(例如eq_refl: 0 = 0
)來證明邏輯公式,或者證明bool
是有人居住的使用戰術。
這種區別仍然有用,因為我們通常不關心使用哪個證明來證明給定的定理,但我們經常關心我們手中有哪個bool
類型的術語(盡管不是在你的例子中)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.