工会的特征功能

时间:2018-11-17 14:13:18

标签: coq

在诸如Coq这样的构造性环境中,我期望析取A \/ B可以是A的证明,也可以是B的证明。如果我在类型为X的子集上重新表示,则表示如果我有xA union B中的证明,那么我要么有xA中的内容,或xB中的证明。因此,我想通过案例分析来定义工会的特征函数,

Definition characteristicUnion (X : Type) (A B : X -> Prop)
           (x : X) (un : A x \/ B x) : nat.

xA中时,它等于1;而在xB中时,它等于0。但是Coq不允许我destruct un,因为“归纳定义“不允许对排序集进行案例分析”。

Coq中是否有另一种方法可以对类型X的子集进行建模,从而使我能够在并集上构造这些特征函数?我不需要提取程序,因此我想只需禁用案例分析中的先前错误就可以为我工作。

请注意,我不想将子集建模为A : X -> bool。这将不必要地变得更强:我不需要排除中间的定律,例如“ x不在Ax不在A中”。

2 个答案:

答案 0 :(得分:1)

正如@AndrásKovács指出的那样,Coq阻止您从Prop中的类型中“提取”与计算相关的信息,以便允许使用一些更高级的功能。关于此主题的研究很多,包括最近的Univalent Foundations / HoTT,但这超出了这个问题的范围。

在您的情况下,您确实希望使用{ A } + { B }类型,它将允许您执行所需的操作。

答案 1 :(得分:0)

我认为子集的联合也应该是子集。我们可以通过将并集定义为逐点析取来实现:

Definition subset (X : Type) : Type := X -> Prop.
Definition union {X : Type}(A B : subset X) : subset X := fun x => A x \/ B x.