Questions tagged «pl.programming-languages»

编程语言尤其关注其语义。

7
类别理论在TCS中的扎实应用?
我一直在学习一些类别理论。当然,这是另一种看待事物的方式。(对于未曾看过它的人,这是一个非常粗略的总结:类别理论提供了仅根据对象之间的功能关系来表达各种数学行为的方式。例如,两组的笛卡尔积之类的东西完全按照其他函数的行为方式,而不是集合中的元素是什么。) 我有些模糊的理解,范畴论在编程语言/逻辑(“理论B”)方面很有用,我想知道算法和复杂性(“理论A”)能从中受益。但是,如果我知道理论B中类别理论的某些可靠应用,那可能会帮助我起步。(我已经隐含地假设,到目前为止,理论A中没有发现任何应用,但是如果您有其中一些,那甚至对我来说更好!) 我所说的“可靠的申请”是: (1)应用程序非常依赖于类别理论,以至于不使用机器就很难实现。 (2)应用程序调用至少一个类别理论的非平凡定理(例如,Yoneda引理)。 (1)可能暗示(2),但是我想确保它们是“真实的”应用程序。 虽然我确实有一些“理论B”背景,但已经有一段时间了,因此,不加任何术语都将不胜感激。 (根据我得到的答案的种类,我可能会在以后将这个问题转换为社区Wiki。但是我确实希望有良好的应用程序,并且要有很好的解释,所以似乎不给某些答卷人奖励是可耻的。)

7
TCS中哪些有趣的定理依赖于选择公理?(或者,确定性公理?)
数学家有时会担心选择公理(AC)和决定性公理(AD)。 选择公理:给定任何集合的非空集,有一个函数,给定一组在,返回的成员。 f S C SCC{\cal C}fffSSSCC{\cal C}小号SS 确定性公理:令为一组无限长的位字符串。爱丽丝(Alice)和鲍勃(Bob)玩游戏,其中爱丽丝(Alice)选择第一位,鲍勃(Bob)选择第二位,依此类推,直到构造了无限字符串。如果x \ in S,爱丽丝赢得比赛,如果x \ not \ in S,鲍勃赢得比赛。假设每个S都有一个玩家获胜的策略。(例如,如果S仅由全1字符串组成,则Bob可以有限次数地获胜。)b 1 b 2 x = b 1 b 2 ⋯小号SSb1个b1b_1b2b2b_2x = b1个b2⋯x=b1b2⋯x = b_1 b_2 \cdots X ∈ 小号x∈Sx \in Sx∉Sx∉Sx \not \in S 小号SSSSSS 已知这两个公理彼此不一致。(考虑一下,或者去这里。) 其他数学家很少或根本不关注这些公理在证明中的使用。它们似乎与理论计算机科学几乎无关,因为我们认为我们主要处理有限的对象。但是,由于TCS将计算决策问题定义为无穷大的位字符串,并且我们将(例如)算法的时间复杂度作为自然值上的渐近函数进行测量,因此始终有可能使用这些公理之一变成一些证据。 在TCS中最引人注目的示例是什么,您知道其中需要这些公理之一吗?(你知道例子吗?) 只是预示了一点,请注意,对角化参数(例如,在所有图灵机的集合上)不是“选择公理”的应用。尽管图灵机定义的语言是一个无限的位字符串,但是每台图灵机都有一个有限的描述,因此我们实际上不需要在这里为无数个无限集选择函数。 (我放置了很多标签,因为我不知道示例将来自何处。)


7
什么是指称语义?
在另一个线程上,Andrej Bauer将指称语义定义为: 程序的含义是程序各部分含义的函数。 使我困扰的是该定义,它似乎并未从通常被认为是非名词性语义的东西(即结构操作语义)中分离出通常被认为是指称语义的东西。 更准确地说,这里的关键要素是语义的模块化或组合性,或者换句话说,它们是根据程序的抽象结构定义的。 由于当今大多数(全部?)形式语义趋向于结构化,这是否是必需的定义? 所以,我的问题是:什么是指称语义?


7
我们对可证明正确的程序了解什么?
计算机程序的复杂性不断提高,计算机在社会中的地位日益重要,这使我想知道为什么我们仍然不集体使用编程语言,而您必须使用编程语言来正式证明代码可以正常工作。 我相信该术语是“认证编译器”(我在这里找到了它):一种编译一种编程语言的编译器,在该语言中,不仅必须编写代码,而且还必须声明代码规范并证明代码符合该规范。规范(或使用自动证明者这样做)。 在互联网上搜索时,我仅发现使用非常简单的编程语言的项目或尝试适应现代编程语言的失败项目。这引出我的问题: 是否有任何认证的编译器实现了成熟的编程语言,还是这很难/从理论上讲是不可能的? 此外,我还没有看到任何涉及可证明程序的复杂性类,例如“由图灵机确定的所有语言的类(存在证明该图灵机停止的证据)”,我将其称为Př Ô v 一个b 升ë řProvableRProvableR作为模拟到[RRR,该组递归语言。 我可以看到学习这样的复杂类的优点:例如,对于Př Ô v 一个b 升ë řProvableRProvableR停机问题是可判定的(I甚至猜想PR o v a b l e R EProvableREProvableRE在明显的方式定义的。将可以决定的最大语言类别)。另外,我怀疑我们是否会排除任何实用的程序:当您无法证明程序终止时,谁会使用该程序? 所以我的第二个问题是: 我们对复杂性类了解多少,这些复杂性类要求其包含的语言具有可证明的某些属性?

6
正则表达式不是
甚至问一个有计算机科学背景的人,正则表达式是什么,答案都可能超出了有限状态自动机的限制。 例如,“正则表达式” /^1?$|^(11+?)\1+$/ 由著名的Perl个性Abigail(以及2002年以来Perl的测试套件的一部分)创建的机器描述了仅接受复合一元数的机器,但在彼得·林茨(Peter Linz)的《形式语言和自动机简介》的第三版中练习4.5(b)让读者使用该泵引理证明 L={an:n is not a prime number}L={an:n is not a prime number}\mathcal{L} = \left\{ a^n : n\ \mathrm{is\ not\ a\ prime\ number} \right\} 不是普通语言。 在区分很重要的情况下,我们应该怎么称呼那些更严格的表达方式?

8
高阶算法
从它们的输入和输出是“普通”数据的意义上讲,大多数众所周知的算法都是一阶的。有些是简单的二阶方法,例如排序,哈希表或map和fold函数:它们是通过函数进行参数化的,但是除了在其他输入数据上调用它外,它们实际上并没有做任何有趣的事情。 有些也是二阶的,但更有趣: 由monoids参数化的手指树 在单调谓词上分裂手指树 前缀和算法,通常又用一个monoid或谓词等参数化。 最后,在我最感兴趣的意义上,有些是“真正的”高阶: Y组合器 差异清单 是否存在其他非平凡的高阶算法? 为了澄清我的问题,在“非平凡的高阶”下,我的意思是“在算法的接口和/或实现中以关键的方式使用计算形式主义的高阶设施”

3
类型类与对象接口
我不理解类型类。我在某处读过,将类型类视为类型实现的“接口”(来自OO)是错误的并且具有误导性。问题是,我在将它们视为不同的东西以及这是怎么回事时遇到了问题。 例如,如果我有一个类型类(使用Haskell语法) class Functor f where fmap :: (a -> b) -> f a -> f b 与接口[1]有什么不同(Java语法) interface Functor<A> { <B> Functor<B> fmap(Function<B, A> fn) } interface Function<Return, Argument> { Return apply(Argument arg); } 我能想到的一个可能的区别是,在特定调用中使用的类型类实现未指定,而是由环境确定的,也就是说,检查可用的模块以实现该类型。这似乎是可以用OO语言解决的实现工件。例如编译器(或运行时)可以扫描包装程序/扩展程序/ monkey-patcher,以在类型上公开必要的接口。 我想念什么? [1]请注意f a,fmap由于自变量是OO语言,因此已将其从中删除,因此您将在对象上调用此方法。此接口假定f a参数已固定。

4
编程语言理论的研究与开放挑战
在像一些一般性讨论的精神这一个,我打开这个线程并打算收集意见认为哪些编程语言的开放的挑战和热点问题的研究。我希望讨论甚至可以浮出水面,对编程语言研究的未来发表看法。 我相信这种讨论将对像我这样对PL感兴趣的新学生研究人员以及已经参与其中的人有所帮助。

5
高效编程语言
不可能编写一种编程语言来允许所有输入都停止的机器,而没有其他输入。但是,为任何标准复杂性类定义这样的编程语言似乎都很容易。特别是,我们可以定义一种语言,在其中我们可以表达所有有效的计算,并且只能表达有效的计算。 例如,对于类似东西:采用您喜欢的编程语言,然后在编写程序(对应于Turing Machine M ')之后,在标头中添加三个值:整数c和整数k,以及默认输出d。当程序被编译,输出图灵机中号给定输入X大小的Ñ运行中号'上X为ç Ñ ķ步骤。如果在步骤上升之前没有停止,则输出默认输出PPPM′M′M'ccckkkdddMMMxxxnnnM′M′M'xxxcnkcnkc n^kM′M′M'cnkcnkc n^kddd。除非我没有记错,否则这种编程语言将使我们能够用表示所有计算,仅此而已。但是,这种提议的语言本质上是无趣的。PPP 我的问题:是否有编程语言以非平凡的方式捕获可计算函数(例如所有有效的可计算函数)的子集?如果没有,这是否有原因?

4
合同与依存类型之间的关系
我一直在阅读一些有关依赖类型和编程合同的文章。从我所阅读的大部分内容来看,似乎合同是动态检查的约束,而依赖类型是静态检查的。 有一些论文使我认为可以对合同进行部分静态检查: 混合类型检查(C. Flanagan-2006) 统一混合类型和合同(J.Gronski,C.Flanagan-2007) 这样,似乎有很多重叠,而我对合同和依存类型的分类就开始消失了。 在我所缺少的两个概念中,还有更深入的东西吗?还是这些只是代表相同基础概念的模糊类别?

7
有关编程语言语义的书籍
我一直在阅读Nielson&Nielson的“ 应用程序语义学 ”,我真的很喜欢这个主题。我想再写一本关于编程语言语义的书-但我确实只能读一本书。 我看了一看Turbak / Gifford的书,但是书太长了。我以为Winskel会没事的,但是我无法使用它(它不在我们的大学图书馆中,而且我缺钱),而且我甚至不确定它是否过时。Slonneger看起来还可以,但是实际部分使它有些长,我对他的风格不太满意。 所以我的问题是- 温斯克尔是一本好书吗?而且过时了吗? 此外,是否还有其他有关此主题的简明书籍?

1
具有规范功能的编程语言
是否有所有功能都具有规范形式的(功能?)编程语言?也就是说,为所有输入集返回相同值的任何两个函数都以相同的方式表示,例如,如果f(x)返回x + 1,而g(x)返回x + 2,则f(f(x ))和g(x)在编译程序时将生成无法区分的可执行文件。 也许更重要的是,我在哪里/如何找到有关程序规范表示的更多信息(谷歌搜索“规范表示程序”效果不佳)?这似乎是一个很自然的问题,而且恐怕我只是不知道我要寻找的正确术语。我很好奇这种语言是否有可能成为图灵​​完整的语言,如果不能,那么在保持这种属性的同时,您可以拥有多么丰富的编程语言。 我的背景非常有限,因此我希望先决条件较少的资源,但是对更高级资源的引用也可能很酷,因为这样我就知道我要努力争取什么。

4
逻辑关系和模拟之间有什么区别?
我是研究程序等效性方法的初学者。我已经阅读了几篇有关定义逻辑关系或模拟的论文,以证明两个程序是等效的。但是我对这两种技术很困惑。 我只知道逻辑关系是归纳定义的,而模拟是基于共归进行的。为什么用这种方式定义它们?他们的利弊分别是什么?在不同情况下应该选择哪一个?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.