在诸如Coq这样的构造性环境中,我期望析取A \/ B
可以是A
的证明,也可以是B
的证明。如果我在类型为X
的子集上重新表示,则表示如果我有x
在A union B
中的证明,那么我要么有x
是A
中的内容,或x
在B
中的证明。因此,我想通过案例分析来定义工会的特征函数,
Definition characteristicUnion (X : Type) (A B : X -> Prop)
(x : X) (un : A x \/ B x) : nat.
当x
在A
中时,它等于1;而在x
在B
中时,它等于0。但是Coq不允许我destruct un
,因为“归纳定义“不允许对排序集进行案例分析”。
Coq中是否有另一种方法可以对类型X
的子集进行建模,从而使我能够在并集上构造这些特征函数?我不需要提取程序,因此我想只需禁用案例分析中的先前错误就可以为我工作。
请注意,我不想将子集建模为A : X -> bool
。这将不必要地变得更强:我不需要排除中间的定律,例如“ x
不在A
或x
不在A
中”。
答案 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.