Haskell 是否有可能在具有简单不一致公理的构造演算中提取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

在构造演算中提取Sigma的第二个元素是非常必要的。此外,似乎没有已知的、简单的方法来扩展具有相依消去的构造演算而不丢失一致性。因此,如何利用一个简单但不一致的公理(例如
类型: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补充了一些细节。