Haskell 是否有可能在具有简单不一致公理的构造演算中提取Sigma的第二个元素?
在构造演算中提取Sigma的第二个元素是非常必要的。此外,似乎没有已知的、简单的方法来扩展具有相依消去的构造演算而不丢失一致性。因此,如何利用一个简单但不一致的公理(例如Haskell 是否有可能在具有简单不一致公理的构造演算中提取Sigma的第二个元素?,haskell,functional-programming,coq,agda,idris,Haskell,Functional Programming,Coq,Agda,Idris,在构造演算中提取Sigma的第二个元素是非常必要的。此外,似乎没有已知的、简单的方法来扩展具有相依消去的构造演算而不丢失一致性。因此,如何利用一个简单但不一致的公理(例如类型:Type或不受限制的递归,例如μ)来提取Sigma的第二个元素 也就是说,给定以下西格玛构造函数: Sigma = λ A : * λ B : A -> * λ a : A λ b : B λ Data : * λ Sigma : ∀ fst : A ∀ snd : B fst
类型:Type
或不受限制的递归,例如μ
)来提取Sigma的第二个元素
也就是说,给定以下西格玛构造函数:
Sigma =
λ A : *
λ B : A -> *
λ a : A
λ b : B
λ Data : *
λ Sigma :
∀ fst : A
∀ snd : B fst
Data
Sigma a b
在与构造演算相当的语言中,除了使用
Type:Type
或其他一些简单的不一致公理外,是否可以实现一个函数,该函数在给定一个术语(如Sigma-Nat(\x->Nat)36
)时提取第二个值,6
?在类型理论如马丁-洛夫类型理论或结构演算的背景下,“不一致性”通常指逻辑不一致性:能够为所有T:type,T导出类型为的术语contra
。在这种情况下,任何其他类型的T
都有人居住:只需对其应用contra
不幸的是,在大多数类型理论中,“有人居住”并没有告诉我们任何关于可兑换性或定义平等性的信息,因为没有类型表示两个术语x
和y
是可兑换的。这意味着
没有办法导出术语
fst : Sigma A B -> A
snd : forall s : Sigma A B, B (fst s)
这样fst(Sigma\ux y)
简化为x
和snd(Sigma\ux y)
借助逻辑矛盾,简化为y
。(我有点滥用符号,对构造函数和类型都使用了Sigma
)但是,你可以使用contra
来假设fst
和snd
的存在,并断言相应的方程在命题上成立
在普通CoC中,如果存在类型项,我们说两个项x1
和x2
在命题上相等
forall T, T x1 -> T x2
(这有时被称为莱布尼茨等式:如果持有第一个谓词的每个谓词都持有第二个谓词,那么两个术语是相等的。)为snd
声明一个类似的表达式有点复杂,因为snd(Sigma\ux y)
和y
没有相同的类型(前者是B(fst(Sigma\ux y)))
,而后者是类型Bx
)。我们可以通过同时为fst
和snd
断言简化引理来解决这个问题:
forall (T : forall x : A, B x -> Type),
T (fst (Sigma _ _ x y)) (snd (Sigma _ _ x y)) ->
T x y
编辑
关于你的评论:由于可兑换性通常不能用一个类型来表示,我们需要修改类型理论中的定义,使之具有一个真正的带有第一和第二投影的西格玛类型——这是一个比简单假设某些公理成立更微妙的操作。有一些系统可以实现这一点,例如Inria开发的验证检查器。IMHO您需要使您的问题更精确,特别是您“提取”的条件是什么。显然,如果我的演算不一致,我可以通过底部消去法提取我想要的任何东西。@ejgallego对你来说可能是显而易见的,但对我来说不是!我已经按照要求把这个问题做得更精确了。事实上,这个问题现在更精确了,因为你需要提取,以恢复原始的项与约化规则的模。我不是说这个问题很明显,但事实上,添加不一致的公理通常意味着你可以定义一个简单的提取函数,因此你必须小心精确的定义。啊,很有见地,回答了这个问题。不过,我想知道用什么样的公理来提取它。在Coq上,这是可能的,但我不确定背后的逻辑是什么。“谢谢你的回答,我就是这么问的。”MaiaVictor补充了一些细节。