呀,這些感應類型定義可能會難以閱讀。
第一部分是:
Inductive ex (A:Type) (P:A -> Prop) : Prop :=
這是與類型本身相關聯。所以你看一個ex
任何時候,就會有一個A
和和P
和ex
將Prop
類型。暫時跳過A
,讓我們關注P
這是謂詞。因此,如果我們以「存在自然數爲素數」爲例,P
可能是is_prime
,其中is_prime
以nat
(自然數)作爲參數,並且如果nat
爲素數則可以存在證明。
在這個例子中,A
將是nat
。在本教程中,A
未被提及,因爲Coq始終可以推斷它。給定謂詞,Coq可以通過查看謂詞參數的類型來獲得A
的類型。
總而言之,在我們的例子中,類型將是ex nat is_prime
。這說明存在一個非常重要的nat,但它沒有說明哪個nat。當我們構建一個ex nat is_prime
時,我們需要說出哪一個 - 我們需要一個「證人」。這使我們在構造函數的定義:
ex_intro : forall x:A, P x -> ex (A:=A) P.
構造名爲ex_intro
。這裏棘手的是構造函數具有該類型的所有參數。因此,在我們找到ex_intro
之後列出的那些之前,我們必須包含類型:A
和P
。
後這些參數來ex_intro
後列出的:x
,這是見證,P x
,這是一個證明,斷言有效,對於證人。使用我們的示例,x
可能是2,P x
將是(is_prime 2)
的證明。
構造函數需要指定它正在構造的類型ex
的參數。這是箭頭後面發生的事情(->
)。這些不需要與調用構造函數時使用的參數相匹配,但通常它們都可以。爲了實現這一點,參數A
是而不是被推斷 - 它正在被明確地傳遞。 (A:=A)
表示ex
中的參數A
應該等於調用構造函數中的A
。同樣,ex
的參數P
正被設置爲P
從調用構造函數。
因此,如果我們用(prime 2)
類型有proof_that_2_is_prime
,我們可以稱之爲ex_intro is_prime 2 proof_that_2_is_prime
,它將有型ex nat is_prime
。我們的證明是存在一個自然數是質數的證明。
直接回答你的問題:在表達forall x:A, P x -> ex (A:=A)
,x:A
是證人和P x
是證人是真實的證明。該表達式不包含謂詞,因爲它是必須傳遞給構造函數ex_intro
的類型參數的一部分。本教程的參數列表不包括A
,因爲是由Coq推斷的。
我希望你明白爲什麼我認爲這個討論對我的教程太詳細了!感謝您的問題。
感謝您花時間寫出這樣詳細的答案。但我認爲關於箭之後的段落是錯誤的。事實上,'A'和'P'是這個類型的參數,因此你在構造函數中沒有選擇。例如你不能寫'ex_intro:forall x:A,P x - > ex(A:= nat)P'。順便說一句,你可以省略'(A:= A)'。這與定義'Inductive ex:forall A,(A - > Prop) - > Prop''不同,定義構造函數的方式更加自由。 – eponier