证明两个同构类型不同

V. *_*ria 3 coq

鉴于这两种类型,

Inductive unit : Set := tt.
Inductive otherUnit : Set := ttt.
Run Code Online (Sandbox Code Playgroud)

Coq 能证明它们是不同的吗unit <> otherUnit

两者在排序上都是单例类型Set,因此不容易找到Set -> Prop区分它们的类型。例如,这甚至不进行类型检查

Definition singletonTT (A : Set) : Prop := forall x : A, x = tt.
Run Code Online (Sandbox Code Playgroud)

因为tt有 typeunit而不是A.

Tej*_*jed 5

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

您不能用 来表达 singletonTT,因为tt正如您所指出的,它仅对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)