两个同构类型不同的证明

时间:2018-08-30 15:01:39

标签: coq

考虑到这两种类型,

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

1 个答案:

答案 0 :(得分:3)

在Coq中实际上允许这两种类型相等;也就是说,您不能证明它们相等或不同,并且假设两者都是一致的。

您不能用tt来表示singletonTT,因为正如您指出的那样,它仅对unit类型进行类型检查。相反,您需要不透明地对待A;例如,您可以将单身人士的属性表示为A /\ forall (x y:A), x = y。当然,这两种类型都是单例,因此不能区分它们。

如果您确实假设Axiom unit_otherUnit : unit = otherUnit,则可以通过将singletonTT强制转换为ttotherUnit来表达类似eq_rec _ (fun S => S) tt otherUnit ax = ttt的内容。

当类型具有不同基数(这意味着它们不是同构的)时,您可以使用其基数来区分它们并证明类型是独特的。简单的示例包括False <> True和unit <> bool,更复杂的示例是nat <> (nat -> nat)