簡體   English   中英

elim在/ \\和\\ /上的Coq中如何工作?

[英]How does elim work in Coq on /\ and \/?

Coq教程 1.3.1和1.3.2節中,有兩個elim應用程序:第一個:

1 subgoal

  A : Prop
  B : Prop
  C : Prop
  H : A /\ B
  ============================
   B /\ A

應用elim H

Coq < elim H.
1 subgoal

  A : Prop
  B : Prop
  C : Prop
  H : A /\ B
  ============================
   A -> B -> B /\ A

第二個:

1 subgoal

  H : A \/ B
  ============================
   B \/ A

應用elim H

Coq < elim H.
2 subgoals

  H : A \/ B
  ============================
   A -> B \/ A

subgoal 2 is:
 B -> B \/ A

有三個問題。 首先,在第二個示例中,我不了解將什么推理規則(或邏輯身份)應用於目標以生成兩個子目標。 對於第一個示例,我很清楚。

根據Coq的手冊,第二個問題是elim與歸納類型有關。 因此,似乎elim根本不能在這里應用,因為我覺得兩個示例中都沒有歸納類型(請原諒我不知道歸納類型的定義)。 為什么在這里可以應用elim

第三, elim通常做什么? 這里的兩個示例未顯示elim的通用模式。 官方手冊似乎是為非常高級的用戶設計的,因為他們在一個由更多術語定義的其他幾個術語上定義了一個術語,並且其語言模棱兩可。

非常感謝您的回答!

簡,首先讓我注意一下,該手冊是開源的,可從https://github.com/coq/coq獲得 如果您認為措詞/定義順序可以改善,請在此處打開一個問題或隨時提交拉取請求。

關於您的問題,我認為您會從Coq的一些更全面的介紹中受益,例如“ Coq'art”,“軟件基礎”或“程序和證明”。

特別地, elim策略試圖將所謂的“消除原理”應用於特定類型。 之所以稱其為消除,是因為從某種意義上講,該規則允許您“擺脫”該特定對象,從而使您可以繼續進行證明。[我建議閱讀Dummett,以更全面地討論邏輯連接詞的起源]

特別是,∨連詞的消除規則通常由邏輯學家編寫如下:

          A   B
          ⋮  ⋮
 A ∨ B    C   C
────────────────
       C

也就是說,如果我們可以獨立地從AB推導C ,那么我們可以從A ∨ B推導它。 這看起來很明顯,不是嗎?

回到Coq,事實證明,由於有“ Curry-Howard-Kolmogorov”等價關系,因此該規則具有計算解釋性。 實際上,Coq並沒有提供大多數內置的標准邏輯連接詞,但它允許我們通過“歸納”數據類型來定義它們,類似於Haskell或OCaml。

∨的定義尤其是:

Inductive or (A B : Prop) : Prop :=
  | or_introl : A -> A \/ B
  | or_intror : B -> A \/ B

也就是說, or AB是包含AB以及“標簽”的數據,它使我們可以“匹配”以知道我們真正擁有的是哪個。

現在,“或的消除原理”具有以下類型:

or_ind : forall A B P : Prop, (A -> P) -> (B -> P) -> A \/ B -> P

Coq的偉大之處在於,這種原理不是“內置”的,而是常規程序! 想一想,您可以編寫or_ind函數的代碼嗎? 我會給你一個提示:

Definition or_ind A B P (hA : A -> P) (hB : B -> P) (orW : A ‌\/ B) :=
  match orW with
  | or_introl aW => ?
  | or_intror bW => ?
  end.

一旦定義了此函數, elim所做的就是應用它,正確實例化變量P

練習:解決使用您的第二個示例applyord_ind代替elim 祝好運!

暫無
暫無

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

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