CSS Тьюринг завершен?

Насколько я знаю, CSS не является полным по Тьюрингу. Но мои познания в CSS очень ограничены.

  • CSS Тьюринг завершен?
  • Рассматривают ли какие-либо из существующих черновиков или комитетов языковые особенности, которые могут обеспечить полноту по Тьюрингу, если это не так прямо сейчас?

person Adam Davis    schedule 23.03.2010    source источник
comment
Это уже было сделано, если вы используете ie6. Они называются выражениями CSS, и по общему мнению, они ужасно неработоспособны и опасны. JS, встроенный в CSS ...   -  person kibibu    schedule 23.03.2010
comment
@Kibibu - Ой! Пожалуйста, вычеркните эту идею из моего мозга, пока она не сложилась сама по себе!   -  person DVK    schedule 23.03.2010
comment
Как может CSS возможно быть полным по Тьюрингу?   -  person SLaks    schedule 23.03.2010
comment
@DVK: с ними можно было бы делать некоторые интересные вещи - особенно в отношении макета, не зависящего от разрешения, - которые все еще остаются сложными или причудливыми в CSS, не прибегая к таблицам. Я думаю, если бы они ограничили его строго декларативным языком выражений без побочных эффектов вместо предоставления полного доступа к механизму сценариев, он был бы лучше воспринят (и, возможно, также, если бы Webkit придумал его первым)   -  person kibibu    schedule 23.03.2010
comment
@SLaks: Не стоит недооценивать мощь HTML5 / CSS3 :)   -  person Niklas B.    schedule 28.02.2012


Ответы (7)


Вы можете закодировать Правило 110 в CSS3, чтобы оно было полным по Тьюрингу, если вы считаете подходящим сопроводительным HTML-файл и взаимодействия с пользователем должны быть частью «выполнения» CSS. Доступна довольно хорошая реализация, и еще одна реализация включена сюда:

body {
    -webkit-animation: bugfix infinite 1s;
    margin: 0.5em 1em;
}
@-webkit-keyframes bugfix { from { padding: 0; } to { padding: 0; } }

/*
 * 111 110 101 100 011 010 001 000
 *  0   1   1   0   1   1   1   0
 */

body > input {
    -webkit-appearance: none;
    display: block;
    float: left;
    border-right: 1px solid #ddd;
    border-bottom: 1px solid #ddd;
    padding: 0px 3px;
    margin: 0;
    font-family: Consolas, "Courier New", monospace;
    font-size: 7pt;
}
body > input::before {
    content: "0";
}

p {
    font-family: Verdana, sans-serif;
    font-size: 9pt;
    margin-bottom: 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; clear: left; }

body > input::before { content: "0"; }

body > input:checked::before { content: "1"; }
body > input:checked { background: #afa !important; }


input:not(:checked) +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input::before {
    content: "1";
}
input:not(:checked) +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input {
    background: #fa0;
}


input:checked +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input::before {
    content: "1";
}
input:checked +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input {
    background: #fa0;
}


input:checked +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input::before {
    content: "1";
}
input:checked +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input {
    background: #fa0;
}

input:checked + input:checked + input:checked +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input::before {
    content: "0";
}
input:checked + input:checked + input:checked +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input {
    background: #fff;
}

input:not(:checked) + input:not(:checked) + input:not(:checked) +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input::before {
    content: "0";
}
input:not(:checked) + input:not(:checked) + input:not(:checked) +
        *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
        input {
    background: #fff;
}

body > input:nth-child(30n) { display: none !important; }
body > input:nth-child(30n) + label { display: none !important; }
<p><a href="http://en.wikipedia.org/wiki/Rule_110">Rule 110</a> in (webkit) CSS, proving Turing-completeness.</p>

<!-- A total of 900 checkboxes required -->
<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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/><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"/>

person Community    schedule 08.03.2011
comment
Формальное определение (простейшее) машины Тьюринга - это просто набор состояний, набор символов, начальное состояние, набор принимающих состояний и функция перехода. В нем нет кривошипа. Под вычислением мы подразумеваем, что кому-то нужно точно применить функцию перехода к ленте, что в этом случае точно так же, как щелчок. Более формально модель вычислений можно рассматривать как набор правил, которым кто-то должен следовать для выполнения вычислений. В этом смысле я считаю CSS полным по Тьюрингу. - person John; 12.06.2018
comment
Этот фрагмент не работает (Firefox 61). Я вижу сетку пустых флажков - ничего не происходит, если вы их отметите. - person OrangeDog; 03.09.2018
comment
@John CSS is turing complete меня беспокоит, но у меня нет проблем с CSS, он такой же полный, как и пара камней на пляж. Правильно ли последнее утверждение? - person Raphael Schmitz; 01.03.2019
comment
@ R.Schmitz нет, в этом случае человек выбирает, куда положить камни, так что объединенная система человек + камни завершается по Тьюрингу. В приведенном выше примере CSS нажатие клавиш табуляция + пробел представляет собой простой повторяющийся процесс, похожий, скажем, на цепь обратной связи. Так что, если C ++ завершен по Тьюрингу с использованием компьютерного оборудования для выполнения инструкций, то не будет преувеличением сказать, что CSS завершен по Тьюрингу с использованием повторяющихся нажатий клавиш для выполнения инструкций. - person woojoo666; 05.03.2019
comment
Вот CodePen правила 110 с использованием того же решения, плюс аннотации и немного Sass, чтобы помочь СУХИМ вещам: codepen .io / laras126 / pen / OYvGZj Я написал сопутствующее сообщение в блоге, объясняющее здесь концепции: notlaura.com/is-css-turing-complete - person notlaura; 16.06.2019
comment
Куча камней требует, чтобы человек интерпретировал их размещение сложным образом, как автомат (TC или иначе). Жесткому диску требуется компьютер для интерпретации программ, хранящихся на нем. Современный компьютер (ЦП + материнская плата + ОЗУ + блок питания) аналогичным образом требует приложенного напряжения 60 Гц, но мы бы назвали его полным по Тьюрингу (и не камни или жесткий диск, за исключением части неясного философский аргумент.) Возможно, это полезный насос интуиции. (Мое мнение состоит в том, что разумно рассматривать простой цикл с пробелом как источник питания переменного тока, но я не уверен, как это сделать. разрешить двусмысленность там.) - person JamesTheAwesomeDude; 23.10.2019
comment
Скажите, что «[CSS] является полным по Тьюрингу, если вы считаете соответствующий сопровождающий HTML-файл и взаимодействие с пользователем частью« выполнения »CSS» более или менее звучит как « он является полным по Тьюрингу, если вы считаете, что он может отображать красную рамку ». - person Andrea Lazzarotto; 19.12.2019
comment
Недавно в этот метод были внесены улучшения: accodeing.com/blog/ 2015 / css3-proof-to-be-turing-complete - person polkovnikov.ph; 23.02.2021
comment
Если пользовательский ввод безусловно требуется, его также можно рассматривать как незавершенный по Тьюрингу. - person Blackbam; 05.05.2021
comment
@AndreaLazzarotto, и компьютер завершен по Тьюрингу, пока на нем есть электричество. Это не похоже на то, что сопутствующий HTML-файл является обманом в любом смысле этого слова, поскольку CSS в любом случае должен работать вместе с HTML. - person JamesTheAwesomeDude; 21.05.2021
comment
@Blackbam Дело в том, что требуемый ввод - это не что иное, как монотонное стук по клавиатуре, заставляющее машину двигаться; ПК требует гораздо более сложных входов для работы, поскольку импульсный источник питания должен адаптироваться к нагрузке. Итак, если требуемый вход для питания делает что-то незавершенным по Тьюрингу, то может ли быть так? - person JamesTheAwesomeDude; 21.05.2021
comment
К сожалению, этот ответ, получивший наибольшее количество голосов, не является точным. Все реализации CSS кодируют только ОДИН ШАГ правила 110 (или любого другого алгоритма). Они не могут перейти к следующему этапу вычислений, который является важной частью полноты по Тьюрингу. - person Yuriy Ershov; 21.07.2021

Одним из аспектов полноты по Тьюрингу является проблема остановки.

Это означает, что если CSS завершен по Тьюрингу, то не существует общего алгоритма для определения того, завершит ли программа CSS выполнение или будет бесконечный цикл.

Но мы можем вывести такой алгоритм для CSS! Вот:

  • Если в таблице стилей не указаны какие-либо анимации, тогда он остановится.

  • Если есть анимация, то:

    • Если какой-либо animation-iteration-count равен infinite, а содержащий селектор соответствует в HTML, тогда он не остановится.

    • В противном случае он остановится.

Вот и все. Поскольку мы только что решили проблему остановки для CSS, отсюда следует, что CSS не завершен по Тьюрингу.

(Другие люди упоминали IE 6, который позволяет встраивать произвольные выражения JavaScript в CSS; это, очевидно, добавит полноты по Тьюрингу. Но эта функция нестандартна, и никто в здравом уме ее все равно не использует.)


Даниэль Вагнер поднял вопрос, который я упустил в первоначальном ответе. Он отмечает, что, хотя я рассмотрел анимацию, другие части механизма стилей, такие как сопоставление селекторов или макет, также могут привести к полноте по Тьюрингу. . Хотя сложно привести формальные аргументы по этому поводу, я попытаюсь обрисовать, почему полнота по Тьюрингу все еще маловероятна.

Во-первых: полные языки по Тьюрингу имеют некоторый способ подавать данные обратно в себя, будь то рекурсия или цикл. Но дизайн языка CSS враждебен этой обратной связи:

  • @media запросы могут проверять только свойства самого браузера, например, размер области просмотра или разрешение в пикселях. Эти свойства могут изменяться посредством взаимодействия с пользователем или кода JavaScript (например, изменения размера окна браузера), но не только с помощью CSS.

  • Псевдоэлементы ::before и ::after не считаются частью DOM и не могут быть сопоставлены никаким другим способом.

  • Комбинаторы селектора могут проверять только элементы выше < / em> и перед текущим элементом, поэтому их нельзя использовать для создания циклов зависимости.

  • Можно сдвинуть элемент при наведении на него курсора, но положение обновляется только при перемещении мыши.

Этого должно быть достаточно, чтобы убедить вас, что сопоставление селекторов само по себе не может быть полным по Тьюрингу. А как насчет макета?

Современный алгоритм макета CSS очень сложен и включает такие функции, как Flexbox и Grid замутняют воду. Но даже если бы можно было запустить бесконечный цикл с макетом, было бы трудно использовать это для выполнения полезных вычислений. Это потому, что селекторы CSS проверяют только внутреннюю структуру DOM, а не то, как эти элементы расположены на экране. Поэтому любое доказательство полноты по Тьюрингу с использованием системы макета должно зависеть только от макета.

Наконец, и это, пожалуй, самая важная причина, по которой производители браузеров заинтересованы в том, чтобы CSS не был завершен по Тьюрингу. Ограничивая язык, поставщики допускают умную оптимизацию, которые делают Интернет быстрее для всех. Кроме того, Google выделяет целую ферму серверов для поиска ошибок в Хром. Если бы существовал способ написать бесконечный цикл с помощью CSS, то они, вероятно, уже нашли бы его ????

person Lambda Fairy    schedule 19.10.2014
comment
Когда люди говорят, что CSS завершен по Тьюрингу, они имеют в виду CSS, который поддерживает анимацию как Turing Complete. Вы можете ограничить языки программирования и сделать вывод, что они не являются полными по Тьюрингу, используя вашу логику, но вам придется указать ограничения. - person philix; 13.08.2015
comment
@philix можешь уточнить? Я учел анимацию в своем ответе. - person Lambda Fairy; 15.08.2015
comment
Я должен не согласиться с определением проблемы остановки и использования анимации, поскольку Вы говорите, что можно написать медиа-запрос с анимацией, поэтому он будет работать бесконечно, если этот медиа-запрос будет согласован, ведь можно решить только запуск кода CSS. Таким образом, проблемы остановки недостаточно, чтобы определить, завершен ли CSS по Тьюрингу. - person madcampos; 12.09.2015
comment
@madcampos Я думаю ... и содержащий селектор соответствует уже в HTML. Кроме того, проблема остановки позволяет вам проверить ввод - страница, на которую вы ссылаетесь, говорит именно об этом. Единственное условие - мой алгоритм работает со всеми программами и входами, что он и делает. - person Lambda Fairy; 12.09.2015
comment
Я думаю, что в этом ответе используется забавное определение остановки - по крайней мере, не то, которое я бы хотел, если бы задавал вопрос. Кажется, вы используете halt для обозначения того, что есть время, когда вычисленные свойства для каждого элемента перестают изменяться; но я бы хотел, чтобы остановка означала, что алгоритм, который преобразует декларативный CSS в вычисленные свойства всех элементов, завершает работу. С последним определением кажется, что нужно значительно больше аргументов, чем просто отсутствие анимации. - person Daniel Wagner; 06.10.2015
comment
Ваша логика здесь обратная. Полнота по Тьюрингу подразумевает, что остановка неразрешима, не означает, что остановка неразрешима, подразумевает полноту Тьюринга. - person asmeurer; 13.01.2017
comment
-1'd. Это не является надлежащим доказательством и неверно истолковывает идею полноты по Тьюрингу и набор неразрешимых проблем для TM (машины Тьюринга). ЕСЛИ машина может решить проблему остановки (определить, остановится ли машина), то она будет более мощнее, чем TM, и, следовательно, также сможет решить любую проблему. TM может решить. Даже если доказательство было правильным, вы доказали, что CSS не только полон по Тьюрингу, но и более мощный, чем машина Тьюринга (что неверно). Я бы посоветовал редактировать с оговоркой, чтобы не вводить в заблуждение студентов теории вычислений. - person Mike Shi; 21.01.2017
comment
@LambdaFairy в чем проблема остановки для CSS? Я не верю, что такое существует. Проблема остановки актуальна только для машин. Самая мощная вычислительная модель, которая у нас есть на сегодняшний день, - это машины Тьюринга. Ваш компьютер такой же мощный, как машина Тьюринга (без бесконечной памяти). Сам по себе CSS не может быть определен как машина. Возможно, вы можете определить CSS-движок браузера как машину, но даже в этом случае он может быть столь же мощным, как TM. Проблема остановки оператора для CSS просто не имеет никакого смысла, если только CSS не стал новым автоматом в иерархии Хомского. - person Mike Shi; 22.01.2017
comment
@LambdaFairy, вам следует взглянуть на главу 5.1 в Sipser's Intro to theory of Computing 3rd Ed. чтобы просмотреть TM и проблему остановки. - person Mike Shi; 22.01.2017
comment
@LambdaFairy Вы неправильно понимаете, как будет выглядеть доказательство неполноты по Тьюрингу. Мы знаем, что проблема остановки неразрешима для TM. Исходное доказательство, кажется, делает заявление, потому что CSS может решить проблему остановки, оно не является полным по Тьюрингу. Если CSS действительно может решить проблему остановки, тогда CSS сильнее машины Тьюринга, потому что он может вычислить то, что TM не может. Мы знаем (из тезиса Черча-Тьюринга), что нельзя построить машину, которая была бы сильнее ТМ / лямбда-исчисления. Следовательно, это противоречие, и ваше первоначальное утверждение неверно. - person Isaac Diamond; 22.01.2017
comment
Отзыв не требуется. Предположим, я пишу программу, которая на каждой итерации обрабатывает половину моей оперативной памяти и записывает обновленные результаты в другую половину. Затем он обработает обновленную половину ОЗУ и снова запишет результаты в первую половину, и так далее и тому подобное. Поскольку полнота по Тьюрингу не определяет предел памяти, вы можете с такой же легкостью просто копировать всю память каждый раз на все больший и больший адрес. Предположим, он делал это для каждой инструкции. Ни в коем случае не нужно читать более ранние данные. Всегда есть свежая копия всего. - person Cedric Mamo; 10.05.2019
comment
продолжение. Итак, если, как вы говорите, вы можете получить доступ только к элементам выше и раньше, у вас может быть просто таблица, а любые неизмененные значения копируются в строку ниже (или, скорее, взяты из ячейки выше). - person Cedric Mamo; 10.05.2019
comment
@LambdaFairy, но разрешимый, подразумевает, что Тьюринг не завершен, не означает, что неразрешимый, подразумевает, что Тьюринг завершен. Это ваша логическая ошибка. - person OrangeDog; 20.05.2019

Согласно этой статье, это не так. В статье также утверждается, что делать это - не лучшая идея.

Процитирую один из комментариев:

Итак, я не верю, что CSS завершен по Тьюрингу. В CSS нет возможности определять функцию. Чтобы система была полной по Тьюрингу, должна быть возможность написать интерпретатор: функцию, которая интерпретирует выражения, обозначающие программы, которые необходимо выполнить. CSS не имеет переменных, которые напрямую доступны пользователю; поэтому вы не можете даже смоделировать структуру, представляющую программу, которую нужно интерпретировать в CSS.

person DVK    schedule 23.03.2010
comment
CSS никоим образом не исполняется. Человек, написавший процитированный комментарий, похоже, этого не понимает. : - \ - person Ryan Prior; 23.03.2010
comment
CSS - это набор инструкций для процессора (механизма компоновки). Что в нем такого не исполняемого? - person DVK; 23.03.2010
comment
Полнота по Тьюрингу - это не только в том, можете ли вы писать программы так, как вы хотите, или в соответствии с вашими убеждениями. Это математическое свойство вычислимости. Итак, вы не можете поверить или нет, что CSS является полным по Тьюрингу, вам нужно доказательство. В этом случае из-за правила 110 CSS является полным по Тьюрингу. - person Mikaël Mayer; 14.06.2013
comment
@ MikaëlMayer - как отмечалось во многих комментариях к ответу 110, это требует от пользователя выполнения действия. Если требуются действия пользователя, CSS без пользователя НЕ завершен по Тьюрингу. - person DVK; 03.05.2014
comment
Некоторые интересные мелочи: в Mozilla есть селектор RegEx для CSS на основе URL-адреса. Это немного, но теперь вы можете создавать однопроходные программы на основе RegEx. У RegEx хорошо получается тестирование простоты :). - person mınxomaτ; 09.08.2016
comment
@DVK повторяющиеся нажатия клавиш, требуемые примером CSS 110, не совсем являются действиями пользователя, они могут выполняться повторяющейся цифровой схемой. Реальным машинам Тьюринга для выполнения работы требуется какое-то электрическое оборудование, поэтому я не понимаю, чем это отличается. - person woojoo666; 05.03.2019

Полнота по Тьюрингу - это не только «определение функций» или «наличие ifs / loops / и т. Д.». Например, в Haskell нет «цикла», в лямбда-исчислении нет «если» и т. Д.

Например, этот сайт: http://experthuman.com/programming-with-nothing. Автор использует Ruby и создает программу "FizzBuzz" только с замыканиями (без строк, чисел или чего-то подобного) ...

Есть примеры, когда люди вычисляют некоторые арифметические функции на Scala, используя только систему типов.

Итак, да, на мой взгляд, CSS3 + HTML является полным по Тьюрингу (даже если вы не можете точно выполнять какие-либо реальные вычисления с ним, не сходя с ума)

person Maurício Szabo    schedule 28.02.2012
comment
Haskell и lambda-caclculus имеют рекурсию. Есть ли CSS? Вы должны быть сумасшедшим, чтобы проводить любые реальные вычисления в Malbolge; в CSS не имеет значения, насколько вы сумасшедшие: это не сработает, CSS не является полным по Тьюрингу, и это не вопрос вашего мнения. - person JMCF125; 14.10.2013
comment
Как я сказал в комментарии выше, CSS3 PLUS HTML является полным по Тьюрингу, потому что он может вычислить правило 110 (которое известно как полное по Тьюрингу). В «Игре жизни» Конвея нет рекурсии, и она также завершена по Тьюрингу. - person Maurício Szabo; 15.10.2013
comment
Извините, мне не удалось найти на этой странице других ваших комментариев. Но, как отмечено в принятом ответе, он является полным по Тьюрингу (...) до тех пор, пока вы считаете (...) взаимодействия с пользователем частью «выполнения» CSS. А я нет. - person JMCF125; 16.10.2013
comment
@ MaurícioSzabo: если пользователь вручную продвинул конечный автомат (здесь отсутствует часть машины, но все в порядке), И документ HTML является бесконечным или динамическим и неограниченного размера (но динамический подразумевает, что JS в любом случае подразумевает завершение Тьюринга) ... тогда обязательно , вы можете вызвать CSS с терпеливой обезьяной и бесконечным завершенным HTML-документом. Но CSS сам по себе, или с небольшим, ограниченным числом взаимодействий с пользователем, или со статическим HTML-документом: не полный по Тьюрингу. - person Eamon Nerbonne; 09.02.2014
comment
Полнота по Тьюрингу не является оскорбительной, но не соответствует чьему-либо мнению. - person trisweb; 05.09.2014
comment
@ MaurícioSzabo: Нет, CSS3 плюс HTML плюс человек, непрерывно выполняющий симуляцию, по Тьюрингу завершен. - person Lambda Fairy; 19.10.2014
comment
@LambdaFairy Это верно и для любой физической машины Тьюринга. - person Miles Rout; 08.12.2016
comment
Милый. Определение лямбда-исчисления в Perl. - person Mike Rosoft; 05.06.2018
comment
@LambdaFairy - это C ++ не полный по Тьюрингу, потому что вам нужен процессор, постоянно обновляющий программу? - person OrangeDog; 03.09.2018
comment
@OrangeDog ЦП является частью компьютера. Пользователь нет. - person Lambda Fairy; 04.09.2018
comment
@LambdaFairy ни то, ни другое не являются частью языка - person OrangeDog; 04.09.2018
comment
@OrangeDog, если вы продолжите придерживаться этого аргумента, тогда MS Paint завершен по Тьюрингу. Где вы проводите черту? - person Lambda Fairy; 04.09.2018
comment
@LambdaFairy именно там, где вам сказано в определении. Полнота по Тьюрингу - это математическое свойство строго определенных математических структур. Языки программирования могут быть полными по Тьюрингу, но никакая конечная физическая система (включая компьютер) никогда не может быть. - person OrangeDog; 04.09.2018
comment
@OrangeDog CSS описывает отображение DOM в вычисляемый стиль. Цикл событий, позволяющий моделировать машину Тьюринга, входит в область общей спецификации HTML, а не в сам CSS. - person Lambda Fairy; 05.09.2018
comment
@LambdaFairy можно сказать то же самое и о C ++. Инструкции, которые позволяют выполнять программу C ++, находятся в сфере компетенции компилятора и ЦП, а не самого кода C ++. Но полнота по Тьюрингу не в том, как она выполняется. Речь идет о том, насколько язык силен в определении шаблонов и отношений. Шаблоны и отношения, определяемые сопоставлениями CSS, столь же эффективны, как и шаблоны, описываемые автоматами Правила 110, так что это то, что делает его завершенным по Тьюрингу. - person woojoo666; 25.03.2019
comment
Ну разве пользователь многократно нажимает кнопку не то же самое, что системные часы делают с процессором? Это эквивалентно до тех пор, пока пользователю не нужно принимать никаких решений о том, что нажимать. Вы кодируете свою проблему, любую вычислимую проблему, а затем, чем бы она ни была, вы просто делаете то же самое: управляете системными часами. Предположим, вы написали короткую функцию Javascript, чтобы просто смотреть и программно нажимать одну и ту же кнопку. Функция JS определенно не будет полной по Тьюрингу. Расчет будет производиться с помощью CSS. Что или кто водит часами, значения не имеет. - person Cedric Mamo; 10.05.2019

Основная проблема здесь в том, что любая машина, написанная на HTML + CSS, не может оценивать бесконечно много шагов (т.е. не может быть «настоящей» рекурсии), если код не является бесконечно длинным. И на вопрос, достигнет ли эта машина конфигурации H за n шагов или меньше, всегда можно ответить, если n является конечным.

person Henrik Sommerland    schedule 14.06.2016
comment
Я не вижу, где в требованиях машины Тьюринга указывается способность обрабатывать бесконечные циклы. Ваш второй пункт, кажется, не действителен. Хотя Тьюринг использовал свою машину Тьюринга для доказательства проблем вычислимости, эти правила, как и проблема остановки, не определяют, является ли машина машиной Тьюринга или нет. Если бы машина Тьюринга включила эти гипотезы в качестве требований, он не смог бы использовать машину Тьюринга для их доказательства. - person Adam Davis; 14.06.2016
comment
@AdamDavis Это абсолютно верный аргумент: если существует алгоритм, который решает проблему остановки для формализма, полного по Тьюрингу, это эквивалентно решению проблемы остановки в целом. Конечно, это оказалось невозможным, а это означает, что если проблема остановки может быть решена для данного формализма, то этот формализм должен не быть полным по Тьюрингу. Следовательно, все формализмы, которые могут оценивать только конечное число шагов, не могут быть полными по Тьюрингу, включая CSS. - person 00dani; 07.10.2016
comment
@AdamDavis Если CSS не может выразить бесконечные циклы, то его ответ на проблему остановки тривиален - программа всегда останавливается. Поскольку все полные языки по Тьюрингу имеют неразрешимую проблему остановки, это исключает возможность CSS из полноты по Тьюрингу. - person Lambda Fairy; 14.01.2017
comment
@LambdaFairy согласно обсуждению под вашим ответом, это зависит от утверждения, что язык не может быть полным по Тьюрингу, если на нем решаема проблема остановки. Я понимаю концепцию и логику этого утверждения. Мне не нравится утверждение «если А, то В» означает «если Б, то А», но я понимаю, почему вы продолжаете продвигать это как доказательство того, что это не машина Тьюринга. - person Adam Davis; 14.01.2017
comment
Это нет, если B, то A! Если не B, то не A! Первое - это утверждение следствия, которое, как вы правильно указываете, неверно. Последний, аргумент контрапозитивом, - это то, что я использую, и он действителен. Обратите внимание на осторожное использование отрицания в моем последнем комментарии - я построил его специально, чтобы избежать этой ошибки. - person Lambda Fairy; 14.01.2017
comment
смотреть на страницу HTML + CSS и сказать, что она останавливается, - все равно что выполнить один шаг машины Тьюринга и сказать, что она останавливается. CSS определяет правила, преобразующие модель DOM, точно так же, как машина Тьюринга определяет правила, преобразующие ленту. Так же, как автомат по правилу 110 определяет правила, которые трансформируют клетки. Таким образом, поскольку CSS может выражать автомат правила 110, он является полным по Тьюрингу. - person woojoo666; 25.03.2019
comment
@ woojoo666 Нет. Возможность преобразовывать состояние в соответствии с набором правил - не то же самое, что быть полным по Тьюрингу. Ничто, что может быть выполнено только для конечного числа шагов, никогда не может быть завершено по Тьюрингу. Если набор правил преобразований может применяться только конечное число раз, возникает вопрос: «Достигнет ли система когда-либо состояния H? всегда разрешима и, следовательно, не является полной по Тьюрингу. Реализация клеточного автомата, которая может выполнять только конечное число итераций, никогда не может быть полной по Тьюрингу. - person Henrik Sommerland; 25.03.2019
comment
@HenrikSommerland, но автоматы Правила 110, реализованные в HTML + CSS (в верхнем ответе), способны к бесконечным итерациям. И прежде чем вы скажете, что взаимодействие с пользователем не является частью CSS, я не об этом говорю. Взаимодействие с пользователем просто управляет переходом состояния, точно так же, как электронная схема управляет переходом состояния машины Тьюринга. Но эту схему не нужно включать в определение машины Тьюринга, так же как взаимодействие с пользователем не нужно включать в определение CSS, чтобы CSS был полным по Тьюрингу. - person woojoo666; 26.03.2019
comment
Компьютер технически не является полным по Тьюрингу, потому что в конечном итоге закончится память. Просто у нас в памяти умещается много проблем. Чтобы быть по-настоящему полным по Тьюрингу, требуется бесконечная память. Разве простое добавление строк в таблицу не было бы эквивалентом увеличения объема оперативной памяти? Т.е. это просто означало бы, что у CSS больше памяти для работы. Дело в том, что, учитывая таблицу бесконечного размера (бесконечная память), CSS может вычислить что угодно. - person Cedric Mamo; 10.05.2019
comment
Нет, это является. Вы всегда можете добавить больше памяти. И никто не говорит о том, что «компьютер» является вычислением Тьюринга, язык завершается по Тьюрингу. язык C является полным по Тьюрингу независимо от каких-либо фактов, касающихся реальных компьютеров. То, что делает ваш компьютер полноценным, - это не физический компьютер, а ISA. И это не имеет ничего общего с памятью, просто количество конфигураций, в которых может находиться машина, не ограничено. - person Henrik Sommerland; 13.05.2019
comment
В CSS / HTML я могу определить таблицу одного размера (который может быть произвольно большим), но затем, когда я запускаю машину, количество состояний, в которых может находиться система, ограничивается размером таблицы. В то время как C, например, может запросить больше памяти в любое время (и мы не заботимся о реальном мире при обсуждении автоматов: P), у нас всегда будет больше пространства состояний, доступного по мере выполнения машины. @CedricMamo Ключевой вывод - реальность не имеет значения. Это факт, что CSS / HTML имеет фиксированное пространство состояний. Если вы добавляете строки таблицы динамически / в браузере, история будет другой. - person Henrik Sommerland; 13.05.2019
comment
@CedricMamo Кстати, если где-то в спецификациях C (а не реализации) есть ограничение на размер адресного пространства, C не будет полным по Тьюрингу. Потребуется добавить некоторую форму внешнего хранилища произвольного размера, чтобы сделать его полным по Тьюрингу. - person Henrik Sommerland; 13.05.2019
comment
Но нет. Фактически, его можно настроить после компиляции, изменив исполняемый файл, если хотите. (на самом деле это единственный способ сделать это для приложения на C #)). На самом деле не имеет ничего общего с самим C. Ничто из того, что вы могли бы построить, никогда не может быть законченным по Тьюрингу с технической точки зрения, учитывая, что бесконечная память является обязательным требованием. - person Cedric Mamo; 13.05.2019
comment
Что касается размера аргумента таблицы, замените слово table словом RAM, и внезапно это применимо к любой компьютерной системе в любой точке мира. Как обойти ограничение на ПК? Вы устанавливаете больше RAM. Как обойти это в CSS? Вы делаете стол побольше. - person Cedric Mamo; 13.05.2019
comment
Я как-то неправильно прочитал ваш комментарий (в то время немного устал) и прочитал это как пространство стека, а не адресное пространство. Но я не думаю, что спецификация C определяет размер адресного пространства. - person Cedric Mamo; 14.05.2019
comment
Да, ни один физический компьютер не может быть полным по Тьюрингу. Но нет никакого смысла говорить о полноте физических вещей по Тьюрингу. Понятие полноты по Тьюрингу носит чисто академический характер и относится к формальным языкам, теории автоматов, теории доказательств и множеству других вещей. Полными по Тьюрингу могут быть только абстрактные системы. Но проблема с CSS / HTML в том, что она всегда исправляется языком. Вы можете сделать его произвольно большим, но только перед выполнением. Если бы вы были в описании системы, добавьте пункт о динамическом изменении html, все обстоит иначе. - person Henrik Sommerland; 15.05.2019
comment
@CedricMamo Я действительно подумываю снять об этом видео на Youtube. Это понятие сбивает с толку многих. - person Henrik Sommerland; 15.05.2019
comment
Я совсем не запутался. Когда я говорю о полноте по Тьюрингу, я знаю, что имею в виду вычислительную модель, а не физическое оборудование, которое ее реализует. Вот почему C #, C ++, brainfuck и, да, еще CSS завершены по Тьюрингу. Языки завершены по Тьюрингу. Их реализации по определению быть не может. Когда я обсуждаю полноту по Тьюрингу, я делаю это вне контекста какой-либо из их реализаций. - person Cedric Mamo; 15.05.2019
comment
«И да, CSS также завершены по Тьюрингу» [необходима цитата] - person Andrea Lazzarotto; 19.12.2019
comment
Проблема ограниченности, кажется, часто поднимается при обсуждении машин Тьюринга. Один очень важный фундаментальный принцип заключается в том, что любая останавливающаяся машина Тьюринга использует конечный объем памяти. Это означает, что для любых полезных вычислений можно построить компьютер с достаточным объемом оперативной памяти / табличного пространства и т. Д. выполнить это. Итак, нам не нужна бесконечная таблица, нам нужна неограниченная таблица. А поскольку ограничения на размер HTML отсутствуют, HTML5 + CSS3 завершен по Тьюрингу. - person Circuit Craft; 17.04.2020
comment
@CircuitCraft. Даже несмотря на то, что размер программы HTML + CSS3 не ограничен, для любой данной программы существует только конечное количество состояний, в которых может находиться оцениваемая страница. Таким образом, проверка не будет завершена. Напротив, TM, реализованный в коде C, будет конечным, но нет ограничений на количество состояний, которые он может принимать во время оценки. - person Henrik Sommerland; 19.04.2020
comment
@HenrimSommerland Я действительно видел, как этот аргумент применим и к C. Указатели имеют ограниченный размер, поэтому технически данное выполнение имеет конечное число состояний (ну, стек тоже, так что это автомат выталкивания). Но C, очевидно, является полным по Тьюрингу (как вы сказали в своем ответе), потому что для этой границы нет предела. - person Circuit Craft; 19.04.2020
comment
@CircuitCraft В спецификации C99 нет ограничений по размеру указателя, поэтому нет ограничений во время выполнения. Проблема с конечным пространством оценки заключается в том, что я могу построить машину, которая перечисляет все возможные состояния (как память, так и внутренние состояния), запускает на ней вашу машину, отслеживает все посещенные состояния, и ваша машина всегда будет либо остановиться или войти в состояние, в котором он уже был, и, следовательно, быть в цикле. Итак, если вы дадите мне программу с конечным пространством состояний, я могу ответить, останавливается она или нет, ваша программа не может быть полной по Тьюрингу. - person Henrik Sommerland; 20.04.2020
comment
@HenrikSommerland Если вы хотите запустить на своем компьютере действительно интенсивно потребляющую память программу, и у вас нет для нее памяти, вы идете и покупаете еще. Точно так же, если у вас недостаточно памяти для программы, которую вы запускаете в CSS, вы просто увеличиваете размер файла HTML и добавляете больше строк и столбцов. В абстрактной вычислительной модели нет никакой разницы. Я хотел сказать, что CSS работает с HTML-файлами произвольного размера. Когда я ссылался на C, я имел в виду, что во время выполнения размер указателя ограничен, так же, как файл HTML ограничен во время выполнения. Мы всегда можем сделать файл побольше. - person Circuit Craft; 21.05.2020

Этот ответ не является точным, поскольку он смешивает описание UTM и самого UTM (универсальная машина Тьюринга).

У нас есть хороший ответ, но с другой точки зрения, и он не показывает прямых недостатков в текущем популярном ответе.


Во-первых, можно согласиться с тем, что человек может работать как UTM. Это означает, что если мы это сделаем

CSS + Human == UTM

Тогда CSS часть бесполезна, потому что всю работу может выполнять Human, который будет выполнять часть UTM. Акт нажатия может быть UTM, потому что вы нажимаете не случайным образом, а только в определенных местах.

Вместо CSS я мог бы использовать этот текст (Правило 110):

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

Руководить своими действиями, и результат будет таким же. Это означает этот текст UTM? Нет, это только ввод (описание), который другой UTM (человек или компьютер) может читать и запускать. Щелчка достаточно для запуска любого UTM.


Важнейшей частью, которой не хватает CSS, является возможность произвольно изменять собственное состояние, если бы CSS мог генерировать клики, то это был бы UTM. Аргумент, что ваши клики являются «кривошипными» для CSS, неточен, потому что настоящая «кривошипная» для CSS - это Layout Engine, который его запускает, и этого должно быть достаточно, чтобы доказать, что CSS - это UTM.

person Yankes    schedule 18.07.2018
comment
Правило 110 - это UTM. Ваш текст является (вероятно, немного недостаточным) описанием Правила 110, так что да, этот текст является (представлением) UTM. - person OrangeDog; 19.09.2018
comment
Если бы CSS мог генерировать щелчки, я использую в своих проектах много микроконтроллеров AVR. Вы можете использовать внутренние часы, которые ограничены до 8 МГц. В качестве альтернативы вы можете подключить внешний кристалл и увеличить частоту до 20 МГц. В качестве альтернативы я мог бы просто поставить полностью внешние часы, так что на самом деле кристалл управляется даже не аппаратным обеспечением процессора. Это означает, что я могу подключить переключатель и часть схемы, чтобы отключить его, и буквально использовать это как часы, когда я нажимаю кнопку. Означает ли это, что если я это сделаю, он перестанет быть полным по Тьюрингу? - person Cedric Mamo; 10.05.2019
comment
Достигните предела размера комментария, продолжение: просто он будет работать с другой скоростью. Его скорость будет зависеть только от того, насколько быстро я могу нажимать кнопку несколько раз. Но мой палец вообще не выполняет никаких вычислений. Так что нет, на полноту Тьюринга не влияет то, что или кто управляет часами. В случае с CSS оборудование не предоставляет вам часы, вам просто нужно поставить свои собственные. Будь то вы или кусок JS-кода для многократной отправки событий нажатия кнопок, на самом деле не имеет значения, что он может вычислить. - person Cedric Mamo; 10.05.2019
comment
@CedricMamo Но ваши щелчки меняют состояние, и вам нужно щелкать только правильные места, иначе это не сработает. Смотрите точно на eli.fox-epste.in/rule110-full.html Я могу щелкнуть ЛЮБУЮ ячейку, если CSS отключен, я все равно нажимаю правильные ячейки и использую UTM. Если все, что вы делаете, будет нажимать одну кнопку, тогда действительно CSS будет UTM, но чтобы иметь что-то подобное, вам понадобится некоторый JS, который является вызовом на нажатие кнопки, и, как мы знаем, JS IS UTM. Для CSS вам нужно что-то, что будет правильно интерпретировать результат и состояние обновления. - person Yankes; 11.05.2019
comment
ну, одна реализация, которую я пробовал, требовала только нажатия табуляции, пробела, табуляции, пробела, табуляции, пробела и т. д. Так что нет, я уже видел вариант, в котором пользовательские решения не нужно было принимать. - person Cedric Mamo; 11.05.2019
comment
@CedricMamo есть ссылка на него? Сейчас я смотрю на пару примеров оттуда, но у меня это не работает. В целом, если я правильно понимаю, CSS изменяет видимость некоторых флажков, и вы используете вкладки для перехода к следующему, и здесь мы снова скрыли UTM, который не является CSS, потому что, когда вы вкладываете вкладки, вы просите браузер вычислить следующую допустимую позицию для навигации, и Для того, чтобы сделать МНОГО сложного кода, здесь используется CSS, но и многое другое. Это означает, что вы доказываете, что ваш браузер поддерживает UTM, а не CSS. - person Yankes; 12.05.2019
comment
Это тот, с которым вы связались. Настройте верхнюю строку, затем щелкните слово «щелкните меня». Тогда в нем должна быть небольшая ошибка или что-то в этом роде, дважды щелкните первую ячейку строки 2 (чтобы перевернуть ее один раз и вернуться в исходное состояние), а затем просто пробел - person Cedric Mamo; 12.05.2019
comment
и браузер, перемещающий фокус на следующую кнопку с фокусом, не отменяет того факта, что именно CSS решает, на чем можно сфокусироваться, а что нет. Браузер не принимает никаких решений. Это все равно, что сказать, что физическая машина Тьюринга не является полной по Тьюрингу, потому что это электродвигатель, который перемещает ленту влево / вправо, а не часть, которая принимает решение, следует ли ее перемещать влево или вправо. - person Cedric Mamo; 12.05.2019
comment
Кнопка @CedricMamo Next не является следующим шагом процессора, теоретически Tab необходимо посетить и изучить каждый элемент HTML, чтобы проверить правильность места остановки. В целом вы доказываете, что TAB + SPACE является полным по Тьюрингу, а не CSS. Вы, вероятно, могли бы отказаться от CSS и заменить его чем-то другим, и у вас мог бы быть UTM. Или, глядя с другой точки зрения, да, CSS решает, что делать дальше, но это единственное, что можно сделать, и этого недостаточно, чтобы быть UTM. У него есть доступ только для чтения к странице. Если он может что-то изменить, он не может прочитать это обратно. В случае ЦП вам не нужно состояние чтения, отправьте только один сигнал. - person Yankes; 13.05.2019
comment
В процессоре, когда одна инструкция завершается, он остается в таком состоянии, что, когда часы снова становятся высокими, текут электроны и правильные транзисторы переключаются в правильных комбинациях. На самом деле вычислениям позволяет выполнять не процессор (вычислительная модель). Это физика! Если бы электроны не следовали по этому пути, то ЦП не смог бы подготовиться к следующему шагу. Браузер - это аппаратное обеспечение, на котором работает CSS. Не знаю, в чем проблема. Css устанавливает такое состояние, что в соответствии с физикой своего мира, в котором он живет, приводит к следующему состоянию. - person Cedric Mamo; 14.05.2019
comment
@CedricMamo Если CSS - это UTM, то файл TXT тоже UTM. Текстовый файл может содержать C ++, C # и даже код CSS. Вам нужно только правильное оборудование. Что же тогда не является UTM? Не могли бы вы показать мне вещи, которые могут производить некоторые вычисления и не являются UTM? - person Yankes; 14.05.2019
comment
Это не C #, код, написанный в текстовом файле, это завершено по Тьюрингу. Это не текстовый файл, завершенный по Тьюрингу. Это набор правил, описанный спецификацией C #, завершенной по Тьюрингу. Написаны ли они в текстовом файле, высечены в камне или просто запомнены целиком, - это те правила, которые являются завершенными по Тьюрингу. Ни компилятор C #, ни какой-либо сгенерированный код. Похоже, вы совершенно не понимаете, что означает фраза «вычислительная модель». Правила, налагаемые спецификацией CSS на то, как этот текст интерпретируется, завершены по Тьюрингу. - person Cedric Mamo; 15.05.2019
comment
@CedricMamo Напротив, IF CSS - это UTM THEN TXT-файл IS тоже UTM. Я использую вашу логику, чтобы доказать это. Я говорю, что CSS НЕ ЯВЛЯЕТСЯ UTM, поэтому я не могу доказать, что TXT - это UTM (потому что это не так). Вся моя точка зрения в том, что CSS в собственном определении не нуждается в том, чтобы быть UTM. Если я ошибаюсь, покажите мне, где в CSS у вас есть рекурсия в его определении? То же самое и с SQL: долгое время он не был UTM, потому что он отсутствовал, но с некоторыми новыми дополнениями он стал UTM. - person Yankes; 16.05.2019
comment
@CedricMamo У него есть циклы, которые могут выполнять те же функции, что и рекурсия (бесконечный вызов - это цикл, а цикл + буфер может имитировать рекурсию). Я хочу сказать, что в определении CSS их нет. - person Yankes; 16.05.2019
comment
Правило 110 доказано, что оно завершено по Тьюрингу. Клеточные автоматы не допускают зацикливания. Клеточный автомат определяет только набор переходов между состояниями. От текущего состояния к следующему. Зацикливание не является обязательным. Игра жизни Conway'a также завершена по Тьюрингу. Он также не поддерживает цикл, а только набор переходов между состояниями. - person Cedric Mamo; 17.05.2019
comment
@CedricMamo Но сотовые автоматы имеют в своем собственном определении цикл, когда выполняется переход состояния, затем он запускается снова и снова и т. Д. Если мы удалим его и оставим только этот переход состояния, то этот автомат больше не будет UTM. Это будет точно такая же ситуация, как и в CSS. Мы можем определить два шага в CA: R - состояние чтения и W - состояние записи, нормальный CA выполняет бесконечную последовательность RWRWRWRW... в случае CSS у нас есть только R, и у нас нет W, потому что он изменяет то, что не может читать , только если мы добавим B - действие браузера, тогда у нас может быть RBRBRBR..., но тогда BBBBBB будет сам по себе UTM. - person Yankes; 17.05.2019
comment
Нет, они этого не делают. Они определяют переход между состояниями и все. Это все, что нужно, чтобы сделать его UTM. Он не указывает, как это должно быть сделано, делаете ли вы это на компьютере или на листе бумаги, если вы будете следовать этим правилам в точности, вы сможете вычислить что угодно. В CSS вы можете определить те же самые переходы между состояниями. Неважно, как они хранятся. Неважно, как к ним обращаются. Неважно, кто следит за часами. Важно то, что CSS позволяет указывать эти правила. И это то, что делает его UTM. Все остальное - это просто дополнительные критерии, добавленные вами и только вами. - person Cedric Mamo; 22.05.2019
comment
@CedricMamo из Wiki: `Для каждой ячейки набор ячеек, называемых ее окрестностями, определяется относительно указанной ячейки. Начальное состояние (время t = 0) выбирается путем присвоения состояния каждой ячейке. Создается новое поколение (увеличивая t на 1) в соответствии с некоторым фиксированным правилом (обычно математической функцией) `Эта часть: advancing t, в целом CA вы определили, что это правило перехода применяется бесконечное количество раз (для каждого момента времени) . не могли бы вы показать мне что-нибудь подобное в определении CSS? - person Yankes; 24.05.2019
comment
yoi определите начальное состояние, установив ячейки. CSS определяет переходы, которые нужно сделать, чтобы превратить текущее поколение в следующее. В автомате это не определяет, как продвигать t. На самом деле клеточный автомат не может продвинуться вперед t. Будь то программа или вы просто разрабатываете следующее поколение на бумаге, применяя правила к поколению, процесс Тьюринга завершается. Продвижение t означает вычисление следующего поколения от текущего. CSS делает именно это. Как продвигать т? Как бы то ни было, черт возьми, вы хотите. Потому что t + 1 - это просто способ математически сказать, что следующее поколение не будет временем - person Cedric Mamo; 25.05.2019
comment
Хорошо, если время опережения не является частью UTM, тогда почти все является UTM. Старый sql: int i = 1; while(i) i =CallSql(sql, i);, препроцессор C (вы снова передаете ему результат), любой калькулятор - UTM. Если вы можете перейти к чему-либо, тогда это может стать UTM. - person Yankes; 25.05.2019
comment
@CedricMamo Еще одна вещь, не могли бы вы использовать этот CSS как UTM в html2pdf инструменте, который имеет 100% поддержку CSS? - person Yankes; 25.05.2019
comment
может у вас есть клеточный автомат? - person Cedric Mamo; 26.05.2019
comment
@CedricMamo Вы не отвечаете на мой вопрос, CSS может быть UTM как часть браузера, который уже имеет возможности UTM. Другое дело, что импорт отличается от CA, CSS - это функция от html до пикселей, а CA - это функция от ячеек к ячейкам. CSS не может снова преобразовать свой вывод, потому что это другая вещь, которую он вводит. У CA нет этой проблемы. - person Yankes; 26.05.2019
comment
хорошо, я отвечу. Нет, не могу. Не могли бы вы поместить туда клеточный автомат? И, пожалуйста, ответьте на этот вопрос, а не на другой, как вы только что задали. Потому что каждый раз передвигаешь стойки ворот. Независимо от того, знаете ли вы, что такое полнота по Тьюрингу или нет, CSS является полным по Тьюрингу. И пожалуйста, css ничего не конвертирует в пиксели, работает чисто на dom. Движок браузера - это то, что отображает dom. В конце концов, полнота по Тьюрингу все равно не определяет, какой это тип функции. Не знать. Совершенно глупо не хотеть учиться. я выхожу - person Cedric Mamo; 26.05.2019
comment
И, пожалуйста, узнайте, что такое полнота по Тьюрингу, и перестаньте изобретать новые правила, чтобы обосновать, почему css не завершен по Тьюрингу. Вы продолжаете добавлять кучу требований, которых просто нет. Так что да, CSS не является полным по Тьюрингу в соответствии с вашей замысловатой идеей полноты по Тьюрингу. Но он ЯВЛЯЕТСЯ полным по Тьюрингу в соответствии с тем, что на самом деле требует полного Тьюринга. - person Cedric Mamo; 26.05.2019
comment
@CedricMamo пиксели в кавычках, CSS определяют внешний вид страницы, это можно выразить просто как пиксели, он все равно не может прочитать его. И я не передвигаю стойки ворот, а только точнее указываю, чего не хватает CSS, чтобы стать UTM. Он не может по-своему выполнить более одного шага, и результат его работы не является его вводом. Если вы можете изменить это, тогда CSS будет UTM. Это математическое требование точности. Чтобы сделать CSS UTM, вам нужно добавить вещи, которые выходят за рамки определения CSS, поэтому я даю вам именно тот случай, когда у нас есть CSS в другой среде, и он не может вытащить UTM, следовательно, CSS - это не UTM. - person Yankes; 27.05.2019
comment
Опять же, в первую очередь можно читать DOM. Он определяет набор tansformation в DOM. Не пиксели. Вы буквально даже не знаете, как работает CSS. Вы также явно используете другую математику, чем все остальные. По крайней мере, прочтите вики-страницу. И вы все еще не ответили на мой вопрос. Если вы не можете поместить CSS в html2pdf, не могли бы вы иметь клеточный автомат? - person Cedric Mamo; 27.05.2019
comment
@CedricMamo Прежде всего я сказал пиксели, а не пиксели. Наибольшее влияние на CSS оказывает отображение / рендеринг элементов AKA (например, цвет результата перекрывающихся прозрачных DIV с тенями). На ваш вопрос есть клеточный автомат, вы имеете в виду CSS как CA? В таком случае я не могу ни доказать, ни опровергнуть, что CSS - это UTM. Но моя ситуация иная, я могу использовать html2pdf, который будет соответствовать спецификации CSS (за исключением некоторых анимаций, но в нашем случае это не имеет значения), и в этом случае CSS недостаточно для создания примера, который запускает это обсуждение, это означает, что он работает, полагаясь о вещах за пределами CSS. - person Yankes; 27.05.2019
comment
и заключаете ли вы это в кавычки или нет, это все равно неправильно. CSS читает DOM и применяет изменения к DOM. Он вообще не несет ответственности за рендеринг чего-либо на экран. Это даже не работа CSS. - person Cedric Mamo; 28.05.2019
comment
@CedricMamo В прошлый раз, когда я проверял, что вычисленные значения CSS находятся за пределами DOM (в смысле элементов html, которые CSS может читать), вам нужно использовать специальную функцию: getComputedStyle, чтобы получить то, что, наконец, имеет элемент стиля. И да, CSS ничего не требует для чтения, но он определяет, что и как он будет отображаться, это API для рендеринга, такой же, как OpenGL, он тоже не считывает ничего, а отправляет запятые на вашу графическую карту. - person Yankes; 28.05.2019

CSS не является языком программирования, поэтому вопрос о полноте по Тьюрингу не имеет смысла. Если в CSS добавляются программные расширения, как это было в IE6, то новый синтез - совсем другое дело.

CSS - это просто описание стилей; в нем нет никакой логики, и его структура плоская.

person Ryan Prior    schedule 23.03.2010
comment
Также (IIRC) существует некоторая двусмысленность в отношении того, какие стили имеют приоритет при использовании нескольких конфликтующих (повторяющихся) стилей. Кроме того, существуют несколько разные способы, которыми разные браузеры реализуют / интерпретируют стили разметки. - person David R Tribble; 23.03.2010
comment
CSS не является языком программирования, поэтому вопрос о полноте по Тьюрингу не имеет смысла. Тавтологические предложения тавтологичны. - person Adam Davis; 23.03.2010
comment
Взгляните на язык программирования Prolog, если вам интересно, почему ваш ответ так сильно отвергается. - person edwin; 16.01.2019