我的猫是否图灵完备?
作者: Chloé Lourseyre编辑: Peter Fordham本文改编自我在 CppCon2021 上的 Lightning Talk。一旦可用,将在此处提供视频链接。本周我将讨论一个更轻松的主题,但仍然非常重要
作者: Chloé Lourseyre
编辑: Peter Fordham
本文改编自我在 CppCon2021 上的 Lightning Talk。一旦可用,将在此处提供视频链接。
本周我将讨论一个更轻松的主题,但仍然非常重要:我的猫图灵完备吗?
认识佩鲁奇
Peluche(法语中的“毛绒”的意思)是一只光滑的猫,不知何故住在我家。
她将是我们今天的测试对象。
Peluche 图灵完备吗?
什么是图灵完备
图灵完备性的概念是,如果设备可以模拟图灵机,那么它就可以执行任何类型的计算1。
这意味着任何实现以下八条指令的机器都是一台计算机(因此可以执行任何类型的计算):
.
and,
: 输入和输出一个值+
和-
:增加和减少存储单元2中包含的值。>
和<
:向左或向右移动当前存储磁带。[
和]
:执行循环。
所以,如果 Peluche 能够执行这八个指令,我们可以考虑她的图灵完备。
图灵完备性的证明
输入输出
首先,如果我能得到反应,我会尝试戳 Peluche。
她看了我一眼,然后才转过身。
所以它是这样的:我戳了她一下,我得到了一个反应。所以她可以处理输入并给出输出。
输入/输出确认!
增减内存值
前几天,我下班回来:
到处都是狗粮……
但后来我仔细看了一下,意识到可以对平板进行编号,如下所示:
对我来说,这看起来很像记忆带!由于她可以将粗磨食物洒在瓷砖上,然后直接从地板上吃掉它们,因此她可以增加和减少给定存储单元中包含的值。
增加/减少确认!
向左或向右移动当前内存单元
还有一次,我在洗碗时不小心洒了一些水在 Peluche 身上。她开始在厨房里到处乱跑,弄得一团糟。
如果您仔细观察(在红色箭头的尖端),您可能会注意到,在弄得一团糟时,她移动了她的碗。
取代她的碗意味着她会将粗磨食物洒在另一块瓷砖上。这算作移动内存头以编辑另一个内存单元。
已确认存储磁带的移位!
执行循环
所以,在这个烂摊子之后,我(显然)不得不清理。
不到五分钟后,我回到厨房对着这个:
是的......她绝对可以执行循环......
循环确认!
我们刚刚证明了 Peluche 确实是图灵完备的。那么现在,我们如何使用她来执行高性能计算?
拿她怎么办?
现在我已经证明 Peluche 是图灵完备的,我可以对她做任何事情!
因此,我试图给她简单的代码来执行3:
结果是最终的:她什么都不做。
虽然它们可以,但也许猫根本不是为了执行代码而设计的?
关于“猫计算”
撇开笑话不谈,猫计算是我给这种通用实践起的名字。根据我的经验,经常发生这样的情况,当有人发现一种语言的新特性时,他们开始在任何地方使用它,只是因为他们可以并且想要。
但是,就像您可以使用 cat 4但不应该执行代码一样,这并不是因为您可以使用应该使用的功能。
他们忙于思考是否可以考虑是否应该这样做。
侏罗纪公园伊恩马尔科姆博士
包起来
猫计算似乎是一个菜鸟错误(而且确实如此),但即使是最有经验的开发人员有时也会犯菜鸟错误(这并不可耻)。
每三年发布一个新版本的 C++。每一次,它都让我想在各种可能的情况下使用新功能。尽管这是围绕此建立一些经验的好机会(在我看来,避免误用功能的最佳方法之一是执行一次这些误用),但这也是获得不良实践的有利基础。
在使用某个功能之前,请务必问问自己是否需要某个功能5,否则您可能会进行猫计算。
此外,猫计算是虐待动物,所以不要这样做。
感谢阅读,下周见!
(在写这篇文章的过程中没有猫受到伤害,但有一只被轻轻戳了一下。)
作者: Chloé Lourseyre
编辑: Peter Fordham
附录
笔记
这是一个简化的定义,非常不准确,但对于这个例子来说已经足够准确了。如果你想要真正的定义,去那里:图灵完整性 - 维基百科
我没有明确说明,但图灵机有一个带有“存储单元”的“存储带”。机器总是指向一个内存单元,也就是前面提到的“当前”内存单元。
您可能无法阅读此代码示例——这是我设计的一种奇特的新语言,称为“braincat”。
实际上,我知道您不能使用猫来执行代码,但是为了比喻,我假设您可以。
当然,当该功能具有已知的好处时,就会出现必要性。我说的不是“绝对必要”,而是“实际必要”。
转自:https://belaycpp.com/2021/11/24/is-my-cat-turing-complete/
本文为转载文章,版权归原作者所有,不代表本站立场和观点。