簡體   English   中英

Coq:如何引用特定構造函數生成的類型?

[英]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.

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