ChatGPT解决这个技术问题 Extra ChatGPT

CSS Turing 是否完整?

据我所知,CSS 不是图灵完备的。但是我对 CSS 的了解非常有限。

CSS Turing 是否完整?

是否有任何现有的草案或委员会正在考虑可能实现图灵完整性的语言特性,如果它不是现在的话?

如果你使用ie6,它已经完成了。它们被称为 CSS 表达式,并且共识是它们非常糟糕和危险。 JS嵌入CSS...
@Kibibu - 哎呀!请在它自行折叠之前从我的脑海中抹去这个想法!
CSS 怎么可能是图灵完备的?
@DVK:你实际上可以用它们做一些很酷的事情——尤其是关于分辨率无关的布局——在 CSS 中仍然很棘手或古怪,而无需求助于表格。我认为,如果他们将其限制为严格的没有副作用的声明性表达语言,而不是允许完全访问脚本引擎,它会得到更好的接受(也许如果 webkit 首先提出它)
@SLaks:不要低估 HTML5/CSS3 的力量 :)

9
9 revs, 8 users 46%

您可以在 CSS3 中对 Rule 110 进行编码,因此只要您将适当的随附 HTML 文件和用户交互视为 CSS“执行”的一部分,它就是图灵完备的。 pretty good implementation 可用,此处包含另一个实现:

body { -webkit-animation: 错误修复无限 1s;保证金:0.5em 1em; } @-webkit-keyframes 错误修正 { from { padding: 0; } 到 { 填充:0; } } /* * 111 110 101 100 011 010 001 000 * 0 1 1 0 1 1 1 0 */ body > input { -webkit-appearance: none;显示:块;向左飘浮;右边框:1px 实心#ddd;边框底部:1px 实心#ddd;填充:0px 3px;边距:0; font-family:Consolas,“Courier New”,等宽字体;字体大小:7pt; } 正文 > 输入::之前 { 内容:“0”; } p { 字体系列:Verdana,无衬线;字体大小:9pt;边距底部:0.5em; } body > input:nth-of-type(-n+30) {border-top: 1px solid #ddd; } body > input:nth-of-type(30n+1) { border-left: 1px solid #ddd;清除:左; } 正文 > 输入::之前 { 内容:“0”; } 正文 > 输入:checked::before { 内容:“1”; } 正文 > 输入:检查 { 背景:#afa !重要的; } 输入:not(:checked) + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ input::before { content: "1"; } 输入:not(:checked) + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ 输入{ 背景:#fa0; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+ input::before { content: "1"; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+ 输入{ 背景:#fa0; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+ input::before { content: "1"; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+ 输入{ 背景:#fa0; } 输入:已检查 + 输入:已检查 + 输入:已检查 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ input::before { content: "0"; } 输入:已检查 + 输入:已检查 + 输入:已检查 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ 输入{ 背景:#fff; } 输入:未(:已检查) + 输入:未(:已检查) + 输入:未(:已检查) + *+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ input::before { content: "0"; } 输入:未(:已检查) + 输入:未(:已检查) + 输入:未(:已检查) + *+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+输入{背景:#fff; } 正文 > 输入:nth-child(30n) { 显示:无!重要的; } 正文 > 输入:nth-child(30n) + 标签 { 显示:无!重要的; }

Rule 110 在 (webkit) CSS 中,证明图灵完备性。

< input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/>


图灵机的正式定义(最简单)只是状态集、符号集、初始状态、接受状态集和转换函数的元组。里面没有曲柄。通过计算,我们的意思是有人需要忠实地在磁带上应用转换函数,这与本例中的点击完全相同。更正式地说,计算模型可以被视为某人进行计算需要遵循的一组规则。从这个意义上说,我认为 CSS 是图灵完备的。
此代码段似乎不起作用(Firefox 61)。我看到一个空复选框网格 - 如果您选中它们,则不会发生任何事情。
@John“CSS 是图灵完备”让我感到不安,但我对“CSS 与 a couple of rocks on the beach 一样图灵完备”没有任何问题。后一种说法正确吗?
@R.Schmitz 不,在这种情况下,人类正在选择将岩石放在哪里,因此图灵完整的是人类+岩石的组合系统。在上面的 CSS 示例中,tab+space 按键是一个简单的重复过程,类似于反馈电路。因此,如果 C++ 正在使用计算机硬件执行指令来完成,那么说 CSS 正在使用重复按键来执行指令来完成并不是一件容易的事
说“[CSS] 是图灵完备的,只要你认为适当的随附 HTML 文件和用户交互是 CSS 的‘执行’的一部分”,或多或少听起来像是“只要你认为它是图灵完备的”表示它可以显示红色边框”。
L
Lambda Fairy

图灵完备性的一个方面是 halting problem

这意味着,如果 CSS 是图灵完备的,那么就没有通用算法来确定 CSS 程序是完成运行还是永远循环。

但是我们可以为 CSS 推导出这样的算法!这里是:

如果样式表没有声明任何动画,那么它将停止。

如果它确实有动画,那么: 如果任何动画迭代计数是无限的,并且包含的选择器在 HTML 中匹配,那么它不会停止。否则,它将停止。

如果任何动画迭代计数是无限的,并且包含的选择器在 HTML 中匹配,那么它不会停止。

否则,它将停止。

而已。由于我们刚刚解决了 CSS 的停止问题,因此 CSS 不是图灵完备的。

(其他人提到了 IE 6,它允许在 CSS 中嵌入任意 JavaScript 表达式;这显然会增加图灵完备性。但该功能是非标准的,无论如何没有人在他们的头脑中使用它。)

丹尼尔瓦格纳提出了我在原始答案中遗漏的一点。他指出,虽然我已经介绍了动画,但样式引擎的其他部分(例如选择器匹配或布局)也可以导致图灵完备。虽然很难对这些进行正式的论证,但我将尝试概述为什么图灵完备性仍然不太可能发生。

首先:图灵完备的语言有某种方式将数据反馈给自身,无论是通过递归还是循环。但是 CSS 语言的设计对这种反馈是敌对的:

@media 查询只能检查浏览器本身的属性,例如视口大小或像素分辨率。这些属性可以通过用户交互或 JavaScript 代码(例如调整浏览器窗口的大小)进行更改,但不能仅通过 CSS。

::before 和 ::after 伪元素不被视为 DOM 的一部分,并且不能以任何其他方式匹配。

选择器组合器只能检查当前元素之上和之前的元素,因此它们不能用于创建依赖循环。

当您将鼠标悬停在某个元素上时,可以将其移开,但该位置仅在您移动鼠标时才会更新。

这应该足以让您相信选择器匹配本身不能是图灵完备的。但是布局呢?

现代 CSS 布局算法非常复杂,有 FlexboxGrid 之类的特性搅浑水。但即使可以通过布局触发无限循环,也很难利用它来执行有用的计算。这是因为 CSS 选择器只检查 DOM 的内部结构,而不检查这些元素在屏幕上的布局方式。因此任何使用布局系统的图灵完备性证明都必须仅依赖于布局

最后——这也许是最重要的原因——浏览器供应商有兴趣保持 CSS 图灵完备。通过限制语言,供应商允许 clever optimizations 让每个人都能更快地上网。此外,Google 将 a whole server farm 专门用于搜索 Chrome 中的错误。如果有办法使用 CSS 编写无限循环,那么他们可能已经找到了 😉


当人们说“CSS 是图灵完备的”时,他们的意思是“支持动画的 CSS 是图灵完备的”。您可以使用您的逻辑限制编程语言并得出结论它们不是图灵完备的,但您必须指定限制。
我认为这个答案使用了一个有趣的“停止”定义——如果我问这个问题,肯定不是我想要的那个,至少。您似乎使用“停止”来表示“每个元素的计算属性都有一段时间停止变化”;但我希望“停止”表示“将声明性 CSS 转换为所有元素的计算属性的算法完成运行”。对于后一种定义,似乎需要更多的论据,而不仅仅是“没有动画”。
你的逻辑在这里倒退。图灵完备性意味着停止是不可判定的,并不意味着停止是不可判定的意味着图灵完备性。
@LambdaFairy CSS 的停止问题是什么?我不相信这样的事情存在。停机问题仅与机器有关。我们今天拥有的最强大的计算模型是图灵机。您的计算机与图灵机一样强大(没有无限内存)。 CSS 不能单独定义为一台机器。也许你可以将浏览器的 CSS 引擎定义为一台机器,但即便如此,它也只能像 TM 一样强大。除非 CSS 已成为乔姆斯基层次结构中的新自动机,否则“CSS 的停止问题”这句话根本没有任何意义。
@LambdaFairy您误解了图灵不完整的证明是什么样的。我们知道停机问题是 TM 无法确定的。最初的证明似乎提出了这一主张,因为 CSS 可以解决它不完整的停止问题。如果 CSS 能够真正解决停机问题,那么 CSS 比图灵机更强大,因为它可以计算 TM 无法计算的东西。我们知道(根据 Church-Turing 论文),无法制造比 TM/Lambda 微积分更强大的机器。因此,这是一个矛盾,你原来的说法是不正确的。
D
DVK

As per this article, it's not。这篇文章还认为,把它变成一个不是一个好主意。

引用其中一条评论:

所以,我不相信 CSS 是图灵完备的。没有在 CSS 中定义函数的能力。为了使系统具有图灵完备性,必须能够编写解释器:解释表示要执行的程序的表达式的函数。 CSS 没有用户可以直接访问的变量;因此,您甚至无法对表示要在 CSS 中解释的程序的结构进行建模。


CSS 不能以任何方式执行。写引用评论的人似乎不明白这一点。 :-\
CSS 是一组对处理器(布局引擎)的指令。它有什么不“可执行”的?
图灵完备性不仅仅在于您是否可以按照自己想要的方式或信念编写程序。它是关于可计算性的数学属性。所以你不能相信 CSS 是图灵完备的,你需要一个证明。在这种情况下,由于规则 110,CSS 是图灵完备的。
@MikaëlMayer - 正如“110”答案中的许多评论中所述,这需要用户执行操作。如果需要用户操作,则没有用户的 CSS 不是图灵完备的
@DVK CSS 110 示例所需的重复按键并不完全是用户“动作”,它们可以由重复数字电路执行。实际的图灵机需要某种电子硬件来驱动执行,所以我看不出这有什么不同
M
Maurício Szabo

图灵完备性不仅与“定义函数”或“具有 ifs/loops/etc”有关。例如,Haskell 没有“循环”,lambda 演算没有“ifs”,等等......

例如,此站点:http://experthuman.com/programming-with-nothing。作者使用 Ruby 并创建了一个“FizzBuzz”程序,只有闭包(没有字符串、数字或类似的东西)......

有些例子是人们只使用类型系统在 Scala 上计算一些算术函数

所以,是的,在我看来,CSS3+HTML 是图灵完备的(即使你不能完全用 then 进行任何真正的计算而不会变得疯狂)


Haskell 和 lambda-caclculus 有递归。有 CSS 吗?在 Malbolge 中进行任何真正的计算都必须发疯。在 CSS 中,不管你有多疯狂:它不会工作,CSS 不是图灵完备的,这不是意见问题。
抱歉,我在此页面中找不到您的任何其他评论。但正如在接受的答案中指出的那样,它是图灵完备的“(...)只要您认为(...)用户交互是 CSS“执行”的一部分”。而我没有。
无意冒犯,图灵完备性不会回应任何人的意见。
@MaurícioSzabo 不,CSS3 加上 HTML 加上人类不断地进行模拟是图灵完备的。
@LambdaFairy 每台物理图灵机也是如此。
H
Henrik Sommerland

这里的根本问题是任何用 HTML+CSS 编写的机器都不能计算无限多的步骤(即不可能有“真正的”递归),除非代码无限长。如果 n 是有限的,那么这台机器会在 n 步或更短的时间内达到配置 H 的问题总是可以回答的。


我没有看到图灵机要求在哪里指定了处理无限循环的能力。您的第二点似乎无效。虽然图灵使用他的图灵机来证明可计算性问题,但这些规则,如停机问题,并不能确定机器是否是图灵机。如果图灵机将这些假设作为要求,他就不可能使用图灵机来证明它们。
@AdamDavis这是一个完全有效的论点:如果存在解决图灵完全形式主义的停止问题的算法,那么这相当于解决一般的停止问题。当然,这已被证明是不可能的,这意味着如果可以解决给定形式的停机问题,那么该形式一定不是图灵完备的。因此,所有只能评估有限步数的形式都不能是图灵完备的,包括 CSS。
not if B then A!如果 not B 那么 not A!前者是affirming the consequent,您正确指出它是错误的。后者 argument by contrapositive 是我使用的并且是有效的。请注意我在上一条评论中对否定的谨慎使用——我专门构建它是为了避免这种谬误。
@woojoo666 不。能够根据一组规则转换状态与图灵完备不同。只有有限数量的步骤才能实现图灵完备。如果转换规则集只能应用有限次,则问题“系统是否会达到状态 H?”总是可判定的,因此它不是图灵完备的。只能进行有限次数迭代的元胞自动机的实现永远不可能是图灵完备的。
“而且,是的,CSS 也正在完善” [需要引用]
Y
Yankes

This 答案不准确,因为它混合了 UTM 和 UTM 本身(通用图灵机)的描述。

我们有 good answer,但从不同的角度来看,它并没有直接显示当前最佳答案中的缺陷。

首先,我们可以同意人类可以作为 UTM 工作。这意味着如果我们这样做

CSS + Human == UTM

然后 CSS 部分是无用的,因为所有工作都可以由 Human 完成,他们将完成 UTM 部分。点击的行为可以是 UTM,因为你不是随机点击,而是只在特定的地方点击。

我可以使用以下文本(Rule 110)代替 CSS:

000 -> 0
001 -> 1
010 -> 1
011 -> 1
100 -> 0
101 -> 1
110 -> 1
111 -> 0

指导我的行动和结果将是相同的。这意味着这个文本UTM?不,这只是其他 UTM(人或计算机)可以读取和运行的输入(描述)。单击足以运行任何 UTM。

CSS 缺乏的关键部分是能够以任意方式改变自己的状态,如果 CSS 可以产生点击,那么它就是 UTM。认为您的点击是 CSS 的“曲柄”的论点是不准确的,因为 CSS 的真正“曲柄”是运行它的布局引擎,它应该足以证明 CSS 是 UTM。


规则 110 是 UTM。您的文本是对规则 110 的(可能稍微不充分)描述,所以是的,文本是 UTM 的(表示)。
“如果 CSS 可以产生点击”我在我的项目中使用了很多 AVR 微控制器。您可以使用限制为 8MHz 的内部时钟。或者,您可以连接一个外部晶体并达到 20MHz。或者,我也可以只提供一个完全外部的时钟,这样实际上驱动晶体的甚至不是 cpu 硬件。这意味着我实际上可以连接一个开关和一段电路来消除它的抖动,并在我按下按钮时将其用作时钟。这是否意味着如果我这样做,它就不再完整了?
@CedricMamo 但是您的点击会改变状态,您只需要点击正确的位置,否则它将无法正常工作。准确地看 eli.fox-epste.in/rule110-full.html 我可以点击任何单元格,如果 CSS 被禁用,我仍然点击正确的单元格并拥有 UTM。如果您所做的只是单击一个按钮“下一步”,那么确实 CSS 将是 UTM,但要拥有类似的东西,您需要有一些每次按钮单击都会调用的 JS,并且我们知道 JS 是 UTM。对于 CSS,您需要一些能够正确解释结果和更新状态的东西。
@CedricMamo 有任何链接吗?现在我从那里看几个例子,但它对我不起作用。总的来说,如果我正确理解 CSS 更改某些复选框的可见性并且您使用选项卡导航到下一个复选框,这里我们再次隐藏了不是 CSS 的 UTM,因为当您使用选项卡时,您会要求浏览器计算下一个有效导航位置,并且奇怪的是它做了很多复杂的代码,这使用了 CSS,但它更多。这意味着您证明您的浏览器是 UTM 而不是 CSS。
@CedricMamo 但是元胞自动机在它自己的定义中有一个循环,当状态转换完成时,它会再次运行,等等。如果我们删除它并只留下这个状态转换,那么这个自动机将不再是 UTM。这将与 CSS 完全相同。我们可以在 CA 中定义两个步骤,R - 读取状态和 W - 写入状态,普通 CA 执行无限序列 RWRWRWRW... 在 CSS 的情况下我们只有 R,而我们没有 W因为它修改了它无法读取的内容,只有当我们添加 B - 浏览器操作时,我们才能拥有 RBRBRBR...BBBBBB 在其自己的 UTM 上。
R
Ryan Prior

CSS 不是一种编程语言,所以图灵完备性的问题是没有意义的。如果将编程扩展添加到 CSS 中,例如 IE6 中的情况,那么新的合成就完全不同了。

CSS 只是样式的描述;它没有任何逻辑,结构扁平。


此外(IIRC),当使用多个冲突(重复)样式时,哪些样式优先存在一些歧义。然后,不同的浏览器实现/解释标记样式以处理的方式略有不同。
“CSS 不是一种编程语言,所以图灵完备性的问题毫无意义。”重言式的句子是重言式的。
如果您想知道为什么您的答案被如此低估,请查看编程语言 Prolog。