计算机科学

为学生,研究人员和计算机科学从业者提供的问答

1
编程语言语义原型制作工具
是否有用于对编程语言语义和类型系统进行原型制作的工具,并且还允许对标准属性(例如类型健全性)进行某种模型检查? 我之所以这样问,是因为我正在读一本有关Alloy的书,它提供了我想要的确切功能,但是对于使用关系逻辑表示的模型而言。 我知道Ott,但是它没有这种“模型检查”功能,因为它专注于为证明助手系统生成代码。 任何有关这种工具存在的参考都将是不错的。

3
通过推断类型自动向下转换
在Java中,必须显式转换以向下转换变量 public class Fruit{} // parent class public class Apple extends Fruit{} // child class public static void main(String args[]) { // An implicit upcast Fruit parent = new Apple(); // An explicit downcast to Apple Apple child = (Apple)parent; } 除了Java不执行任何类型推断的事实外,是否还有其他原因可以满足此要求? 使用新语言实现自动向下转换是否存在任何“陷阱”? 例如: Apple child = parent; // no …

1
如何在某些条件下将集合划分为给定数量的不相交子集?
给我一个集合,一个整数,和一个非负整数a_ {ij}。我的问题是要找到小号不相交的子集S_j的\ {1,\ ldots,K \}这样的:甲≜ { 1 ,... ,ķ } A≜{1,…,k}A\triangleq\{1,\ldots,k\}小号⩽ ķ s⩽ks\leqslant k一个我Ĵaija_{ij}小号ss小号ĴSjS_j { 1 ,... ,ķ }{1,…,k}\{1,\ldots,k\} ⋃ 小号Ĵ = 1个小号Ĵ = 甲⋃sj=1Sj=A\bigcup_{j=1}^s S_j=A ; 和 | 小号Ĵ | ⩽ 一个我Ĵ| 小号Ĵ| ⩽一我Ĵ|S_j|\leqslant a_{ij}对于S_j中的所有i \,我∈ 小号Ĵ我∈ 小号Ĵi\in S_j并且j = 1 ,… ,sj = 1 ,… ,sj=1,\ldots,s。 如何解决这个问题呢?找到可行的解决方案难吗? 我认为解决这个问题并不容易,因为我尝试了一些以j …


3
为什么用联合,串联和星号运算定义正则表达式?
甲定期expresssion递归定义 aaa对某些a∈Σa∈Σa \in \Sigma是正则表达式, εε\varepsilon是一个正则表达式, ∅∅\emptyset是一个正则表达式, (R1∪R2)(R1∪R2)(R_1 \cup R_2),其中R1R1R_1和R2R2R_2是正则表达式是一个正则表达式, (R1∘R2)(R1∘R2)(R_1 \circ R_2),其中R1R1R_1和R2R2R_2是正则表达式是一个正则表达式, (R1)∗(R1)∗(R_1)^*其中R1R1R_1是正则表达式是正则表达式。 该定义摘自第64页的 西普瑟,迈克尔。计算理论导论,第三版。参与学习,2012年。 现在,我有以下问题。 为什么不定义包含intersection,complement或者reverse操作? 如果我们改变了第4项,我们得到一个等价定义,即,对于每个普通的语言,有修改的正则表达式,反之亦然?R1∩R2R1∩R2R_1 \cap R_2 我知道此定义是完整且定义明确的,但是为什么它比其他等效的,定义良好且完整的定义更可取呢?

4
为什么我们必须以抽象为代价?
为什么从速度上看,高级语言似乎永远无法到达低级语言?高级语言的示例包括Python,Haskell和Java。定义低级语言会比较棘手,但可以说C。可以在Internet上找到比较结果,他们都同意C的速度要快很多,有时会提高10倍甚至更多。11^1 是什么导致如此巨大的性能差异?为什么高级语言无法赶上? 最初,我认为这是所有编译器的错,并且将来会有所改善,但是一些最受欢迎的高级语言已经存在了几十年,而在速度方面它们仍然落后。他们难道不能简单地编译成类似于C的语法树,然后遵循生成机器代码的相同过程吗?还是与语法本身有关? 11^1范例: 计算机语言基准游戏 朱莉娅的基准页面


1
索引到模式数据库-Korf的Optimal Rubik's Cube解决方案
作为一个有趣的项目,我一直在研究Richard Korf的C#实现-使用模式数据库找到Rubik立方体的最佳解决方案。 https://www.cs.princeton.edu/courses/archive/fall06/cos402/papers/korfrubik.pdf 实际上,它确实有效,我只是在尝试改善解决方案。 Korf在他的论文中提到的一件事是他如何存储和索引到模式数据库。理想情况下,我认为我们想使用一个魔方的实例来生成数组的索引。 我的问题是有关生成此索引的最佳方法。 我的解决方案是生成最小的完美哈希。这涉及将所有多维数据集保留在内存中,直到我发现整个模式数据库,然后基于此生成最小的完美哈希。根据模式数据库的大小,MPH需要花费几个小时才能运行,但由于将其保存到磁盘,因此只需要执行一次。最后,我可以丢弃仅存储MPH的多维数据集本身。这样,我可以采用随机的魔方,应用模式,然后在MPH中查找数组索引以获取估计的解决方案长度。 我相信Korf和Shultz在他们2005年发表的名为“大规模广度优先搜索”的论文中描述了一种确定多维数据集索引的更好方法。 https://www.aaai.org/Papers/AAAI/2005/AAAI05-219.pdf 本文描述了一种算法,该算法根据排列的字典顺序生成索引。基本上,您可以采用排列{1,2,3}并确定它是最小的,索引为0。接下来是{1,3,2},索引为1,依此类推。 我觉得我应该能够将此算法应用于魔方,以在模式数据库中获取其索引,但是我很难弄清楚它在实践中如何工作。 例如,“仅角落”模式数据库包含所有已去除其边缘贴纸的魔方。此集中正好有88,179,840个多维数据集。魔方上的任何角都可以处于24种不同状态之一。可以根据其他7个角来计算第8个角形立方体的状态,因此,只有角形图案数据库中的每个立方体具有0到23之间的7个值 例如{0、3、6、9、12、15、18、21}定义“已解决”的多维数据集,其中所有边缘贴纸均被删除。 如果我将正面旋转90度,则排列可能是:{0、3、11、23、12、15、8、20} 有没有办法从这些排列中获取索引?


1
通过笛卡尔积找到有限笛卡尔积的子集的最小覆盖
给定一个笛卡尔乘积两个有限集的的子集,我希望通过笛卡尔乘积本身的集合来找到它的最小覆盖范围。I×JI×JI \times J 例如,给定与之间的乘积,我可以观察到子集并尝试使用最少数量的笛卡尔积覆盖它。I={A,B,C}I={A,B,C}I=\{A,B,C\}J={1,2,3}J={1,2,3}J=\{1,2,3\}{(A,2),(B,3),(B,2)}{(A,2),(B,3),(B,2)}\{(A,2), (B,3), (B,2)\} 这样做的两种方法是和,都需要2个产品。次佳的解决方案可能会将其分解为3个琐碎的乘积。{A}×{2}+B×{2,3}{A}×{2}+B×{2,3}\{A\} \times \{2\} + B \times \{2,3\}{A,B}×{2}+{B}×{3}{A,B}×{2}+{B}×{3}\{A,B\}\times \{2\} + \{B\}\times \{3\} 是否可以有效地找到这种最佳覆盖率(例如,在多项式时间内)?


2
为什么最小定点(lfp)在程序分析中很重要
我试图对程序分析中最小不固定点(lfp)的重要性有一个全面的了解。例如,抽象解释似乎使用了lfp。关于程序分析的许多研究论文也都集中在寻找最小固定点上。 更具体地说,这篇Wikipedia中的文章:Knaster-Tarski定理提到lfp用于定义程序语义。 它为什么如此重要?任何简单的例子都可以帮助我。(我正在尝试了解大图)。 编辑 我认为我的措辞不正确。我不质疑lfp的重要性。我的确切问题(初学者)是:计算lfp对程序分析有何帮助?例如,为什么/如何抽象解释使用lfp?如果抽象域中没有lfp,会发生什么? 希望我的问题现在更具体。

3
抽象数据类型和对象之间有什么区别?
关于Programmers.SE的答案描述了Cook的一篇论文(对象不是ADT)说的是 对象在类型的值上表现得像特征函数,而不是代数。对象使用过程抽象而不是类型抽象 ADT通常在程序中具有唯一的实现。当某人的语言具有模块时,可以实现ADT的多种实现,但通常不能互操作。 在我看来,在库克的论文中,恰好是这样一种情况:对于库克论文中使用的集合的特定示例,可以将一个对象视为特征函数。我不认为对象通常可以视为特征函数。 另外,Aldritch的论文互操作性的力量:为什么对象不可避免 ¹暗示了 Cook的定义实质上将动态调度识别为对象的最重要特征 同意这一点,并同意艾伦·凯说的话 对我来说,OOP意味着仅消息传递,本地保留和保护以及状态过程的隐藏以及所有事物的极端后期绑定。 但是,这些伴随 Aldritch论文的演讲幻灯片表明,Java 类是ADT,而Java接口是对象-的确,使用接口“对象”可以互操作(如上面的要点之一所述,OOP的主要功能之一) )。 我的问题是 我是否正确地说特征函数不是对象的关键特征,而弗兰克·希亚尔(Frank Shearar)错误呢? 即使对象不使用动态分派,数据是否仍通过Java接口的对象示例相互通信?为什么?(我的理解是动态调度更加灵活,并且接口是迈向目标C / smalltalk / erlang样式消息传递的一步。) 依赖倒置原理的思想是否与ADT和对象之间的区别有关?(请参阅Wikipedia页面或The Talking Objects:有关面向消息的编程的故事)尽管我是这个概念的新手,但我了解它涉及在程序的“各层”之间添加接口(请参阅Wikipedia页面图)。 如果需要,请提供其他示例/说明,以区分对象和ADT。 ¹ 本文(于2013年出版)易于阅读,并以Java实例总结了Cook的2009年论文。我强烈建议至少略读一下,不要回答这个问题,而只是因为它是一篇好论文。

1
用矩形块覆盖的NP硬度(Google哈希代码2015年测试回合)
Google Hash Code 2015测试回合(问题说明)询问了以下问题: 输入:具有一些标记正方形的网格,阈值,最大面积Ť ∈ Ñ甲∈ Ñ中号MMŤ∈ ñT∈NT \in \mathbb{N}甲∈ ÑA∈NA \in \mathbb{N} 输出:一组整数(以为单位)的不相交矩形的最大可能总面积,以使每个矩形至少包含标记的正方形,每个矩形最多具有面积。Ť 一中号MMŤTT一种AA 用Google的术语来说,网格是比萨饼,标记的正方形是火腿,不相交的矩形是切片。 通过添加一个额外的输入我们可以清楚地将这个问题改写为决策问题,并将答案设为“是否存在满足总面积至少为正方形的条件的一组不相交的矩形”。 ÑÑ ∈ Ñn∈Nn \in \mathbb{N}ñnn 我的问题是:虽然Google问题要求应聘者为特定情况下的计算问题找到“尽可能好的”解决方案,但我认为一般问题(在其决策措词中)很可能是NP完全的。但是,我找不到显示NP硬度的减少量。(NP成员身份是即时的。)如何证明此问题对NP不利? 下面是一些示例,以帮助可视化问题。考虑 x网格,带有标记的正方形,和,以图形方式表示以指示标记的正方形:4 { 0 ,1 ,2 ,3 } × { 0 ,1 ,2 ,3 } (1 ,1 )(0 ,2 )(2 ,2 )444444{ 0 ,1 ,2 ,3 …

3
为什么要使用监视器而不是信号灯?
我目前正在上大学的并行编程课程,最近我们开始谈论监视器的概念。虽然我了解相互排斥的必要性,但我不明白为什么要为此使用监视器。 据我了解,监视器可以确保在关键时刻始终只有一个或没有进程。我们可以使用信号量来实现这一目标。此外,我们使用信号量来实现监视器(或至少一种实现它们的可能性)。 那么,为什么我要实现与带有信号量的信号量完全相同的东西呢?我可以获得什么好处?

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.