[英]Coq: How to refer to the types generated by a specific constructor?
例如,如果我定義一個從nat到nat的函數,那就是
Definition plusfive(a:nat): nat := a + 5.
但是,我想定義一個函數,其參數是使用“S”構造函數(即非零)構造的nat,是否可以直接指定為類型? 就像是
Definition plusfive(a: nat.S): nat := a + 5.
(我知道,這種情況下我也可以用一個證明,添加一個參數a
不為零,但我想知道是否有可能直接命名基於“S”的構造函數的類型)。
函數必須完整,所以你必須使用一些子類型而不是nat
,或者添加一個減少輸入空間的參數,例如(H: a<>0)
Definition plusfive(a:nat) (H:a<>0) :=
match a as e return a=e -> _ with
| S _ => fun _ => a + 5
| _ => fun H0 => match (H H0) with end
end eq_refl.
然而,已發現這些技巧在大型開發中使用起來非常麻煩,並且通常會在基類型上使用完整函數來返回錯誤輸入值的虛擬值,並證明使用正確參數調用函數與功能定義分開。 例如,請參閱標准庫中如何定義除法。
Require Import Nat.
Print div.
div =
fun x y : nat => match y with
| 0 => y
| S y' => fst (divmod x y' 0 y')
end
: nat -> nat -> nat
所以Compute (div 1 0).
給你0
。
好處是你可以直接在表達式中使用div
,而不必交錯分母非零的證明。 在定義表達式之后 ,證明表達式是正確的,而不是同時進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.