[英]Coq nat type check on match
Theorem nzgtz : ~ 0 > 0.
Proof.
unfold not.
unfold gt.
unfold lt.
intros H.
inversion H.
Qed.
Print nzgtz.
Definition pred1 (n : nat) : n > 0 -> nat :=
match n with
| O => fun pf => match (nzgtz pf) with end
| S n' => fun _ => n'
end.
我對帶有O
的第一個分支如何返回類型(0 > 0) -> nat
的函數感到困惑。 問題是:如何將match False with end
nat
match False with end
? 似乎沒有返回值? 這種表達是什么意思?
我不是專家。 但是從功能的角度來看, pred1
的返回值是一個返回 nat
的函數 ,而不是一個nat
。 對於任何輸入n
,結果函數都會將n > 0
的證明pf
轉換為nat
。
函數不需要(或不能)對不存在的參數返回任何值。 在極端情況下,當函數的域為空時,共域也為(或可以視為)空。
這就是為什么當pf
為False
(這是一個空類型)時,該函數無法返回任何特定的nat
值,並且它什么也不返回的原因。
從語法上講,如果將函數的簡化版本與從nat
到nat
的簡化版本進行比較:
Definition p : False -> nat :=
fun pf => match pf with end.
Definition p1 : nat -> nat :=
fun pf => match pf with
| 0 => 0
| S p => p
end.
與p1
的兩個分支/構造函數相比, p
中False
的證明pf
沒有match with
構造函數(0個分支)。
出於同樣的理由,你可以使用的證明False
以( 空洞地 )證明什么。
match X with end
是為了排除不可能的情況。 確實,讀取pred1
函數的零分支的典型方法是“這種情況是不可能的”。
因此,不可能的情況不需要返回值。
ps:請注意,我無法設想一個pred1
,其中pred1
會很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.