我想將我的程序構建爲抽象模塊,並編寫使用抽象類型的函數。但是我不能使用match
來破壞抽象類型,所以我將不得不創建某種反轉引理,但我也不能在其上使用match
。我試圖把我的問題歸結爲:Coq:如何從可判斷的Prop創建一個bool?
首先創建一個Module Type
,可以使用decidable
類型。
Require Import Decidable.
Module Type decType.
Parameter T : Type.
Axiom decT : forall (a b:T), decidable (a=b).
End decType.
這裏是一個例子:nat
是可判定的。但其目的是編寫plus
等,只針對抽象類型。 (我已經刪除了參數zero
,Succ
和他們的要求,使這裏的例子最小)。
Require Peano_dec.
Module nat_dec <: decType.
Definition T := nat.
Definition decT := Peano_dec.dec_eq_nat.
End nat_dec.
現在我的問題:我想寫參數化的decType
模塊上有一個返回true
如果a=b
和false
否則功能的模塊。由於a
和b
是decType
這應該是可判定的(因此可以計算或?),但是如何編寫beq
?
Module decBool (M: decType).
Import M.
Definition beq (a b:T) : bool :=
???
.
End decBool.
我的想法到目前爲止是,我有一個布爾函數添加到decType模塊類型,像這樣:
Module Type decType.
Parameter T : Type.
Axiom decT : forall (a b:T), decidable (a=b).
Parameter decB : forall (a b:T), {a=b}+{a<>b}.
End decType.
然後定義nat_dec
模塊decB
以上。
這是一個必須做的事情(即定義函數decB)?是否不可能使用抽象的事實,即類型是可判定的,而不通過返回布爾的函數?