考虑到这两种类型,
Inductive unit : Set := tt.
Inductive otherUnit : Set := ttt.
Coq可以证明它们是不同的,即unit <> otherUnit
吗?
两者都是Set
类别的单例类型,因此要找到区分它们的Set -> Prop
并不容易。例如,它甚至不键入check
Definition singletonTT (A : Set) : Prop := forall x : A, x = tt.
因为tt
的类型为unit
,而不是A
。
答案 0 :(得分:3)
在Coq中实际上允许这两种类型相等;也就是说,您不能证明它们相等或不同,并且假设两者都是一致的。
您不能用tt
来表示singletonTT,因为正如您指出的那样,它仅对unit
类型进行类型检查。相反,您需要不透明地对待A
;例如,您可以将单身人士的属性表示为A /\ forall (x y:A), x = y
。当然,这两种类型都是单例,因此不能区分它们。
如果您确实假设Axiom unit_otherUnit : unit = otherUnit
,则可以通过将singletonTT
强制转换为tt
:otherUnit
来表达类似eq_rec _ (fun S => S) tt otherUnit ax = ttt
的内容。
当类型具有不同基数(这意味着它们不是同构的)时,您可以使用其基数来区分它们并证明类型是独特的。简单的示例包括False <> True和unit <> bool,更复杂的示例是nat <> (nat -> nat)
。