metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-07-02 01:18 pm

Функциональный апартеид

http://udpn.livejournal.com/78084.html?style=mine
Обычно говорят, что нормальный порядок редукции нужен для того, чтобы bottom в аргументе не превращался в bottom в результате всегда, когда это возможно. Само по себе это никому не нужно. Дело именно в отложенном вычислении аргументов. Чтобы определить управляющие конструкции в языке с аппл. порядком редукции, нужно это делать явно, и их можно ввести только конечное число на этапе разработки языка. С нормальным порядком мы имеем возможность определять новые конструкции в любом количестве.

Всех, кто ничего не понял - отправить в индию и бангладеш, купаться в ганге и поклонятся коровам.

[identity profile] jakobz.livejournal.com 2012-07-02 11:43 am (UTC)(link)
Обычно говорят что нормальный порядок нужен для <общее определение>, но на деле оно для <частный случай>

[identity profile] udpn.livejournal.com 2012-07-02 12:01 pm (UTC)(link)
Неправда. Вот я могу зависимыми типами и проверкой тотальности вообще убрать bottom из языка. В чём тогда будет разница между нормальным и аппликативным порядками? А она будет. В одном случае аргументы if_then_else_ будут вычисляться все, а в другом — только нужные. Если не ошибаюсь, это называется как раз "операционной семантикой."

[identity profile] jakobz.livejournal.com 2012-07-02 12:27 pm (UTC)(link)
Да, пожалуй ты прав, именно bottom тут не причем. Хотя убрать его совсем не выйдет, проблема остановки же есть.

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

[identity profile] gds.livejournal.com 2012-07-02 12:31 pm (UTC)(link)
конкретно в Coq проблема останова не стоит: для любой рекурсивной функции требуется доказательство завершимости. Соответственно, никакого bottom'а не нужно.
Но разница между нормальным и аппликативным порядками остаётся.

[identity profile] nponeccop.livejournal.com 2012-07-02 02:23 pm (UTC)(link)
> Убрать его совсем не выйдет, проблема остановки же есть.

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

[identity profile] jakobz.livejournal.com 2012-07-02 02:41 pm (UTC)(link)
А реально ли достаточно? Ну т.е. кто-нибудь пробовал сделать что-нибудь уровня веб-сервера с каким-нибудь TODO-списком на не тьюринг-полной какой-нибудь штуковине?

[identity profile] nivanych.livejournal.com 2012-07-02 06:18 pm (UTC)(link)
Ну, это небольшое лукавство.
Стоит заметить, что любая программа на Тьюринг-полном языке раскладывается на составляющие —
одна составляющая проверяет, что некое вычисление не ноль и повторяет его,
вторая составляющая Тьюринг-худая, и вполне бы, достаточно просто-типа-лямбды с натуральными числами.
Но вот уж завершающейся части Agda/CoQ для второй составляющеей точно достаточно.
Например, веб-сервер не должен завершаться.
Однако, его halting problem никого не волнует ;-)
А вот один шаг (ну или некоторой ограниченное число шагов) его работы (та самая Тьюринг-худая составляющая) очень даже интересно проверить на корректность, соответствие спецификации ивсётакое.
ext_615659: (Трубка вас согреет)

[identity profile] akuklev.livejournal.com 2012-07-02 07:41 pm (UTC)(link)
Реально достаточно. На агде и родственных языках заведомо определяются все функции для которых можно дать оценку сверху скорости выполнения, которая выразима в терминах обобщённых функций Гудштейна (http://en.wikipedia.org/wiki/Goodstein's_theorem). То есть любые алгоритмы даже со временем работы O(2^2^...^n) туда влезают. Влезают любые фукнции Акермана, стрелки Конвея и чёртзнаетчто. Я слышал лишь про одну тотальную функцию, которую так построить невозможно — функцию TREE Фридмана.

Цитирую Википедию (http://en.wikipedia.org/wiki/Kruskal%27s_tree_theorem): «The latter theorem ensures the existence of a rapidly growing function that Friedman called TREE, such that TREE(n) is the length of a longest sequence of n-labelled trees T1,...,Tm in which each Ti has at most i vertices, and no tree is embeddable into a later tree.
The TREE sequence begins TREE(1) = 1, TREE(2) = 3, then suddenly TREE(3) explodes to a value so enormously large that many other "large" combinatorial constants, such as Friedman's n(4), are extremely small by comparison. A lower bound for n(4), and hence an extremely weak lower bound for TREE(3), is A(A(...A(1)...)), where the number of A's is A(187196), and A() is a version of Ackermann's function: A(x) = 2↑↑...↑x with x-1 ↑s (Knuth up-arrows). Graham's number, for example, is approximately A^64(4) which is much smaller than the lower bound A^A(187196)(1).»

В общем, на практике больше не нать.

[identity profile] jakobz.livejournal.com 2012-07-03 12:17 am (UTC)(link)
Всех, кто ничего не понял - отправить в индию и бангладеш, купаться в ганге и поклонятся коровам.

[identity profile] thedeemon.livejournal.com 2012-07-02 12:35 pm (UTC)(link)
Another outcome of total functional programming is that both strict evaluation and lazy evaluation result in the same behaviour, in principle; however, one or the other may still be preferable (or even required) for performance reasons. (педивикия)

[identity profile] nivanych.livejournal.com 2012-07-02 01:39 pm (UTC)(link)
Ну, операционная семантика будет различаться, конечно.
Но тут, обычно, больше интерен аспект ресурсов.

[identity profile] udpn.livejournal.com 2012-07-02 09:31 pm (UTC)(link)
"Абстрактная семантика"?

[identity profile] nivanych.livejournal.com 2012-07-03 08:39 am (UTC)(link)
Ви так говорите, как будто, в этом есть что-то плохое!

[identity profile] udpn.livejournal.com 2012-07-03 09:30 am (UTC)(link)
Да я пытаюсь понять, как это называется на самом деле, и всего-то.

[identity profile] nivanych.livejournal.com 2012-07-03 05:40 pm (UTC)(link)
Да вроде бы, описания потребления ресурсов (CPU-memory-traffic) программой в разные моменты времени всегда обзывалось ресурсной семантикой...