Wolfram语言与Mathematica 13.2 版本(6)

描述

国际象棋作为可计算数据

我们使用Wolfram 语言的目标是使尽可能多的可计算性。版本13.2 添加了另一个域- 国际象棋 -支持导入 FEN和 PGN 国际象棋格式:

Wolfram

PGN文件通常包含许多游戏,每个游戏都表示为FEN字符串的列表。这将计算特定PGN文件中的游戏数量:

Wolfram

这是文件中的第一个游戏:

Wolfram

鉴于此,我们现在可以使用Wolfram 语言的视频功能来制作游戏视频:

Wolfram

控制失控计算

早在1979 年,当我开始构建SMP(Wolfram语言的前身)时,我做了一件对某些人来说似乎非常大胆,甚至可能是鲁莽的事情:我建立系统从根本上进行“无限评估”,也就是说,继续使用任何给定的定义,直到无能为力。换言之,评价过程将一直持续到达到一个固定点。“但是如果x没有值,你说x= x + 1会发生什么?”人们会问。“那样的话,系统不会爆炸吗?”嗯,从某种意义上说是的。但我赌了一把,人们真正想做的对普通计算进行无限评估的好处将远远超过任何看似“毫无意义的极端情况”(如x = x + 1)可能出现的问题。好吧,43年后,我想我可以自信地说,那场赌博成功了。无限评估的概念- 结合 Wolfram语言的符号结构 -一直是巨大力量的源泉,大多数用户根本就没有遇到过,也永远不必考虑x = x + 1 的“极端情况”。

但是,如果您键入x = x +1,则系统显然必须执行某些操作。从某种意义上说,最纯粹的事情就是永远继续计算。但是34年前,这导致了实际计算机上的灾难性问题-事实上今天仍然如此。因为一般来说,这种重复评估是一个递归过程,最终必须使用操作系统为每个程序实例设置的调用堆栈来实现。但是操作系统的工作方式(仍然!)是为堆栈只分配固定数量的内存- 如果这被溢出,操作系统只会让你的程序崩溃(或者,在早期,操作系统本身可能会崩溃)。这意味着从版本1 开始,我们就需要在无限评估方面有一个限制。在早期版本中,我们试图给出“到目前为止的计算结果”,包装在Hold 中。回到版本10,我们开始只返回原始表达式的保留版本:

Wolfram

但即使这样在某种意义上也不安全。因为有了其他无限的定义,人们最终可能会遇到这样一种情况:即使试图返回持有的形式也会触发额外的无限计算过程。

最近,特别是随着我们对多计算的探索,我们决定重新审视如何限制无限计算的问题。在某个理论层面上,人们可以想象使用超限数之类的东西明确表示无限计算。但这充满了困难,并且具有明显的不可判定性(“这个无限计算输出真的和那个一样吗?”等)。但是在版本13.2 中,作为一种新的“纯符号”“失控计算”方法的开始,我们引入了构造TerminatedEvaluation——正如它所说,它只是象征性地表示终止计算。

所以这是现在x = x + 1 发生的情况:

Wolfram

这样做的一个显着特征是它是“独立封装的”:计算的一部分的终止不会影响其他部分,因此,例如,我们得到:

Wolfram

终止评估和延迟评估之间存在复杂的关系,我们正在开发该领域一些有趣且可能强大的新功能。但就目前而言,终止评估是在计算失控的极端情况下提高系统“安全性”的重要结构。引入它使我们能够解决多年来围绕复杂失控计算的“理论上无法解决”的问题。

终止评估是如果您遇到像$RecursionLimit这样的系统范围的“护栏”,您会遇到的情况。但在版本13.2 中,我们还加强了对显式请求中止的处理— 通过将新选项“PropagateAborts 添加到CheckAbort”。一旦生成了中止(直接使用Abort[ ]),或者由于TimeConstrained[ ] 或MemoryConstrained[]之类的结果生成了中止,就会出现中止应该传播多远的问题。默认情况下,它会一直向上传播,因此您的整个计算最终将被中止。但是从版本2(1991年)开始,我们就有了函数CheckAbort,它检查给定表达式中的中止,然后停止中止的进一步传播。

但是在诸如时间约束[]之类的问题上总是有很多棘手之处。由这些生成的中止是否应该以与中止[] 中止相同的方式传播?在版本13.2 中,我们现在已经清理了所有这些,并使用显式选项PropagateAborts forCheckAbort。使用PropagateAborts→True,所有中止都会被传播,无论是由Abort[]还是TimeCompated[]或其他什么启动。传播中止→错误传播不中止。但也有PropagateAborts→Automatic,它从TimeConstrained[]等传播中止,但不从Abort[]传播中止。

另一个小列表函数

在我们永无止境的扩展和完善Wolfram语言的过程中,我们一直在寻找人们反复想要做的“大量计算工作”,我们可以为此创建具有易于理解的名称的函数。如今,我们经常在Wolfram 函数存储库中对此类函数进行原型设计,然后进一步简化其设计, 并最终在永久核心 Wolfram语言中实现它们.在版本13.2 中,此过程只产生了两个新的基本列表操作函数:PositionGreatest和 PositionSmallest。

自版本1 以来,我们一直拥有Position 函数,以及Max。但多年来,我经常发现自己需要做的事情是将这些结合起来来回答这个问题:“这个列表的最大值在哪里?当然,在Wolfram 语言中做到这一点并不难——Position[list,Max[list]]基本上就是这样做的。但是有一些边缘情况和扩展需要考虑,只有一个函数来做到这一点很方便。而且,更重要的是,现在我们有了像TakeLargest这样的函数,这个函数有一个明显的、一致的名称:PositionLargest。(我所说的“显而易见”,是指你听完之后显而易见;我们直播的设计评审会议的档案会揭示——就像经常发生的情况一样——我们实际上花了相当长的时间才确定“显而易见”。

这是位置最大和在行动:

Wolfram

而且,是的,它必须返回一个列表来处理“关系”:

Wolfram

审核编辑 :李倩

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分