簡體   English   中英

Coq:目標只是一種類型(當使用帶有不必要參數的定理時)

[英]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: natex: 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.

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