[英]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
也就是說,如果我們可以獨立地從A
和B
推導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
是包含A
或B
以及“標簽”的數據,它使我們可以“匹配”以知道我們真正擁有的是哪個。
現在,“或的消除原理”具有以下類型:
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
練習:解決使用您的第二個示例apply
和ord_ind
代替elim
。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.