在像Coq这样的建设性环境中,我期望qzxswpoi脱离的证明要么是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
时它将等于1,当A
在x
时它将等于0。然而,Coq不让我B
,因为“排序集的案例分析不允许进行归纳定义或”。
在Coq中有另一种方法来模拟destruct un
类型的子集,这将允许我在联合上构造那些特征函数吗?我不需要提取程序,所以我想简单地禁用案例分析中的先前错误对我有用。
请注意,我不想将子集建模为X
。这将是非常强大的:我不需要排除中间的法律,例如“A : X -> bool
在x
或A
不在x
”。
正如@AndrásKovács所指出的,Coq阻止您从Prop中的类型中“提取”与计算相关的信息,以便允许使用某些更高级的功能。关于这个主题已经有很多研究,包括最近的Univalent Foundations / HoTT,但这超出了这个问题的范围。
在你的情况下,你确实想要使用类型A
,它将允许你做你想要的。
我认为子集的联合也应该是一个子集。我们可以通过将union定义为逐点析取来实现:
{ A } + { B }