【发布时间】:2019-04-09 18:05:09
【问题描述】:
假设我们想将(有符号)整数表示为自然数上的格洛腾迪克群(或者,换句话说,作为一对(m, n),其中可以理解的整数是m - n):
data ZTy : Type where
MkZ : (m, n : Nat) -> ZTy
现在语言免费提供给我们的(结构)相等不再是我们想要的:相反,我们只关心某种等价关系(即(m1, n1) ~ (m2, n2) iff m1 + n2 = m2 + n1)。没什么大不了的,让我们写下来!
data Equiv : ZTy -> ZTy -> Type where
MkEquiv : (prf : m1 + n2 = m2 + n1) -> Equiv (MkZ m1 n1) (MkZ m2 n2)
但是处理这个问题很快就会变得一团糟。 prop Const 类型的任何参数(对于 prop : ZTy -> Type)至少可以用 (k : ZTy) -> (k `EqZ` Const) -> prop k 替换(作为一个更应用的例子,我正在努力写下这种类型的双面归纳证明,我'我仍然不确定我是否得到了那个词的签名是否正确)。
此外,像replaceZ : {P : ZTy -> Type} -> (k1 `Equiv` k2) -> P k1 -> P k2(显然)这样的函数不存在,但我找不到更好的候选者。作为一个有趣的附注/观察,如果我们不导出ZTy 的定义,则没有客户端代码P 可以观察到它,并且此函数对任何P 都有意义在任何其他模块中定义,但看起来我们无法在语言中内化它。
我想到的另一件事是将谓词集限制为在等价关系下成立的谓词。也就是说,将P : ZTy -> Type 替换为P : ZTy -> Type, pAdmissible : ZPred P 之类的东西,其中ZPred 带有在等价关系下其不变性的证明:
data ZPred : Type -> Type where
MkZPred : {P : ZTy -> Type} ->
(preservesEquiv : {k1, k2 : ZTy} -> (k1 `Equiv` k2) -> P k1 -> P k2) ->
ZPred P
无论如何,处理此类类型的常用方法是什么?还有什么可以很好用的吗?
我也听说过一些关于商类型的东西,但我不太了解。
【问题讨论】:
-
我们在 SO 上使用 4 空格缩进格式化代码块。语言取自标签或由
<!-- language: ___ -->或<!-- language-all: ___ -->HTML cmets 手动给出;我们只是没有 Idris 的荧光笔。
标签: idris dependent-type