Hask或Agda是否有均衡器?

关于这是一个math问题,我还是有点犹豫不决。但是我怀疑一般的math家是不太可能知道或关心这个类别的,特别是Haskell程序员可能会这样做。

所以,我们知道Hask有或多或less的产品(当然,我正在与理想化的Hask合作)。 我感兴趣的是它是否有均衡器(在这种情况下,它将有所有有限的限制)。

直觉上看起来不是这样,因为你不能像你所能做的那样进行分离,所以一般来说子对象似乎很难构build。 但是对于你想要的任何特定情况,似乎你可以通过在Set中计算均衡器并计算它来破解它(因为毕竟,每个Haskelltypes都是可数的,每个可数集是同构或者有限types或者自然,Haskell都有)。 所以我不明白我怎么去寻找一个反例。

现在,Agda似乎更有希望了:形成子对象相对容易。 是明显的西格玛typesΣ A (λ x → fx == gx)是一个均衡器吗? 如果细节不起作用, 道德上是平衡器吗?

拟议的候选人不是一个平衡器,但它的不相关的副本是

Agda中的均衡器的候选人看起来不错。 所以我们试试吧。 我们需要一些基本的工具包。 这里是我的refusenik ASCII相关对types和齐次内涵相等。

 record Sg (S : Set)(T : S -> Set) : Set where constructor _,_ field fst : S snd : T fst open Sg data _==_ {X : Set}(x : X) : X -> Set where refl : x == x 

这是您的两个function均衡器的候选人

 Q : {ST : Set}(fg : S -> T) -> Set Q {S}{T} fg = Sg S \ s -> fs == gs 

fst投影发送Q fgS

它说: Q fg的一个元素s源types的一个元素,连同一个certificatefs == gs 。 但是这是一个均衡器? 让我们尝试做到这一点。

要说什么是均衡器,我应该定义函数组合。

 _o_ : {RST : Set} -> (S -> T) -> (R -> S) -> R -> T (fog) x = f (gx) 

所以现在我需要certificate任何标识fohgoh h : R -> S必须通过候选项fst : Q fg -> S 我需要同时提供另一个组成部分, u : R -> Q fg和certificateh因素是fst ou 。 这里是图片: (Q fg , fst)是一个均衡器,只要图表在没有u ,就有一个独特的方式来添加u ,而图表仍然可以通勤。

均衡器图

这里是调解u存在。

 mediator : {RST : Set}(fg : S -> T)(h : R -> S) -> (q : (foh) == (goh)) -> Sg (R -> Q fg) \ u -> h == (fst ou) 

显然,我应该select与h相同的S元素。

 mediator fghq = (\ r -> (hr , ?0)) , ?1 

留给我两项certificate义务

 ?0 : f (hr) == g (hr) ?1 : h == (\ r -> hr) 

现在,由于Agda的定义相等性具有函数的η律,所以?1可以被refl 。 对于?0 ,我们祝福q 。 平等的职能尊重应用程序

 funq : {ST : Set}{fg : S -> T} -> f == g -> (s : S) -> fs == gs funq refl s = refl 

所以我们可以采取?0 = funq qr

但是,让我们不要过早地庆祝,因为调解态度主义的存在是不够的。 我们也需要它的独特性。 而这里的车轮很可能会走向虚无because because,因为==内涵的 ,所以唯一性意味着只有一种方式来实现中介地图。 但是,我们的假设也是内涵。

这是我们的certificate义务。 我们必须表明,任何其他调解态度主义都与mediator所select的一样。

 mediatorUnique : {RST : Set}(fg : S -> T)(h : R -> S) -> (qh : (foh) == (goh)) -> (m : R -> Q fg) -> (qm : h == (fst om)) -> m == fst (mediator fgh qh) 

我们可以立即通过qm取代并获得

 mediatorUnique fg .(fst om) qh m refl = ? ? : m == (\ r -> (fst (mr) , funq qh r)) 

这看起来不错,因为阿格达有logging的法律,所以我们知道这一点

 m == (\ r -> (fst (mr) , snd (mr))) 

但是当我们试图制造? = refl ? = refl ,我们得到了投诉

 snd (m _) != funq qh _ of type f (fst (m _)) == g (fst (m _)) 

这是令人讨厌的,因为身份certificate是独特的(在标准configuration中)。 现在,你可以通过假设扩展性并使用关于平等的其他一些事实来摆脱这个问题

 postulate ext : {ST : Set}{fg : S -> T} -> ((s : S) -> fs == gs) -> f == g sndq : {S : Set}{T : S -> Set}{s : S}{tt' : T s} -> t == t' -> _==_ {Sg ST} (s , t) (s , t') sndq refl = refl uip : {X : Set}{xy : X}{qq' : x == y} -> q == q' uip {q = refl}{q' = refl} = refl ? = ext (\ s -> sndq uip) 

但是这是过度的,因为唯一的问题是恼人的平等certificate不匹配:实现的可计算部分匹配在鼻子上。 所以解决办法是与不相关的工作。 我用Ex extential quantifier代替Sg ,第二个成分被标记为与点不相关。 现在certificate我们使用证人是好的证据不重要。

 record Ex (S : Set)(T : S -> Set) : Set where constructor _,_ field fst : S .snd : T fst open Ex 

而新的候选均衡器是

 Q : {ST : Set}(fg : S -> T) -> Set Q {S}{T} fg = Ex S \ s -> fs == gs 

除了最后的义务之外,整个build筑都和以前一样

 ? = refl 

被接受!

所以是的,即使在内涵设置中,eta法则和将领域标记为无关紧要的能力也给我们带来了平衡。

这种结构没有不可判定的types检查。

Hask

哈斯克没有均衡器。 一个重要的事情要记住的是,思考一个types(或任何类别的对象)和他们的同构类真的需要考虑箭头。 你所说的底层集是真的,但具有同构底层集的types当然不一定是同构的。 Hask和Set之间的一个区别是Hask的箭头必须是可计算的,而实际上对于理想化的Hask,它们必须是全部的。

我花了一段时间试图提出一个真正的辩护反例,并发现一些提示说不能做,但没有证据。 但是,如果你愿意的话,我确实有一些“道德”的反例。 我不能certificate在Haskell中不存在均衡器,但它似乎是不可能的!

例1

 f, g: ([Int], Int) -> Int f (p,v) = treat p as a polynomial with given coefficients, and evaluate p(v). g _ = 0 

均衡器“应该”是其中p(n)= 0的所有对(p,n)的types,以及将这些对注入([Int],Int)的函数。 由希尔伯特的第十个问题,这个集合是不可判定的。 在我看来,这应该排除它是一个Haskelltypes的可能性,但我不能certificate(有可能有一些奇怪的方式来构build这种types,没有人发现?)。 也许我没有连接一两个点 – 也许certificate这是不可能的不难?

例2

假设你有一门编程语言。 你有一个编译器,它接受源代码和一个input,并产生一个函数,函数的固定点就是输出。 (虽然我们没有像这样的编译器,但是像这样指定语义是不是闻所未闻的)。 所以你有了

 compiler : String -> Int -> (Int -> Int) 

(联合国)咖喱成function

 compiler' : (String, Int, Int) -> Int 

并添加一个function

 id' : (String, Int, Int) -> Int id' (_,_,x) = x 

那么编译器',id'的均衡器就是源程序,input,输出三元组的集合,这是不可计算的,因为编程语言是完全一般的。

更多的例子

select你最喜欢的不可判定的问题:它通常涉及决定一个对象是否是某个集合的成员。 您经常有一个可用于检查特定对象的属性的总function。 您可以使用此函数创build一个均衡器,其中types应该是您的不可判定集合中的所有项目。 这是前两个例子的来源,还有更​​多。

阿格达

我不太熟悉Agda。 我的直觉是,你的西格马型应该是一个均衡器:你可以写下来的types,以及必要的注入函数,它看起来像它完全满足定义。 但是,作为不使用Agda的人,我不认为我真的有资格检查细节。

但是,真正的实际问题是,types检查并不总是可计算的,所以这样做并不总是有用的。 在上面所有的例子中,你可以写下你提供的西格玛types,但是如果没有证据,你将无法轻易地检查是否有某种types的成员。

顺便说一句,这就是为什么Haskell不应该有均衡器:如果这样做,types检查将是不可判定的! 依赖types是什么使一切都打勾。 他们应该能够expression有趣的math结构的types,而Haskell不能,因为它的types系统是可以决定的。 所以,我自然会期望理想化的Agda拥有所有有限的限制(否则我会感到失望的)。 其他依赖types的语言也是如此; 例如,Coq应该有一切限制。