我想定义一个参数化命题decidable
,讨论其他参数化命题的可判定性。举一个常见的例子,even
是一个参数化的命题,它接受 1 个类型的参数nat
,它是可判定的。lt
是一个带 2 个类型参数的参数化命题,nat
它也是可判定的。我想decidable
成为这样,decidable even
并且decidable lt
都是可证明的命题。
定义的主要困难decidable
是指定它的类型。它必须接受任何类型的参数化命题A -> B -> C -> ... Z -> Prop
,其中 A...Z 是类型,它们的总数是任意的。
这是我的第一次尝试:
Inductive decidable { X : Type } ( P : X ) : Prop :=
| d_0 : X = Prop -> P \/ ~ P -> decidable X P
| d_1 : forall ( Y Z : Type ), ( X = Y -> Z )
-> ( forall ( y : Y ), decidable Z ( P y ) )
-> decidable X P.
我认为它应该可以P \/ ~ P
用作前提,因为 Coq 足够聪明,可以在给定先验前提的情况下d_0
弄清楚这一点。它不是。P : Prop
X = Prop
所以现在我找不到任何方法来拼出整个丑陋的东西:如果我想说 someP : A -> B -> C -> ... Z -> Prop
是可判定的,它必须写成forall ( a : A ) ( b : B ) ( c : C ) ... ( z : Z ), P a b c ... z \/ ~ P a b c ... z
。啊。
但也许我错过了一些东西。由于我对 Coq 多态性的初步了解,我可能忽略了一些巧妙的技巧。
有什么建议么?