2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Ленивые вычисления
Сообщение27.05.2025, 14:02 


22/10/20
1265
Хочу разобраться, что представляют собой ленивые вычисления. В целом вроде бы понял, но хочу убедиться, что правильно понял.

Если взять аналогию из математики. Пусть у нас есть, допустим, такая дробь: $$\frac{8\sqrt{5+(1,2 - 2,2)^{cos(\pi)}}}{4\sqrt{5+(1,2 - 2,2)^{cos(\pi)}}}$$

Мы можем действовать двумя способами: либо сократить на корень, т.е. делать вот такую цепочку: $$\frac{8\sqrt{5+(1,2 - 2,2)^{cos(\pi)}}}{4\sqrt{5+(1,2 - 2,2)^{cos(\pi)}}} = \frac{8}{4} = 2$$

либо вычислять сам корень:
$$\frac{8\sqrt{5+(1,2 - 2,2)^{cos(\pi)}}}{4\sqrt{5+(1,2 - 2,2)^{cos(\pi)}}} = \frac{8\sqrt{5+(-1)^{cos(\pi)}}}{4\sqrt{5+(-1)^{cos(\pi)}}} = \frac{8\sqrt{5+(-1)^{(-1)}}}{4\sqrt{5+(-1)^{(-1)}}} = \frac{8\sqrt{5+(-1)}}{4\sqrt{5+(-1)}} = \frac{8\sqrt{5-1}}{4\sqrt{5-1}} = \frac{8\sqrt{4}}{4\sqrt{4}} =$$ $$= \frac{8 \cdot 2}{4 \cdot 2} = \frac{16}{8} = 2 $$

На неформальном уровне это можно так описать: в первом случае мы упрощаем начиная сразу снаружи, а во втором идем "изнутри наружу". Правильно ли я понимаю, что именно в этом и заключается разница между ленивыми вычислениями (первый случай) и энергичными (второй)?

Кстати, даже здесь, в математическом примере, видно, что при энергичных вычислениях может возникнуть ситуация, когда мы дублируем (в случае выше - по 2 раза) одинаковые вычисления (дважды вычисляли (1,2 - 2,2), $cos(\pi)$ и все остальное).

Если это правда, тогда получается следующее. В лямбда исчислении мы тоже можем вычислять по-разному: либо начинать с каких-то внутренних редексов, либо с внешнего (левого). Пусть мы хотим, например, вычислить такое выражение: $(\lambda x. (\lambda y. y) x)((\lambda zt. z) g)$


Если начинать с внешнего редекса, то будет такая строчка: $$(\lambda x. (\lambda y. y) x)((\lambda zt. z) g) = (\lambda y. y) ((\lambda zt. z) g) = ((\lambda zt. z) g) = (\lambda t. g)$$
А если начинать с внутренних редексов, то получится такое вычисление: $$(\lambda x. (\lambda y. y) x)((\lambda zt. z) g) = (\lambda x. x)(\lambda t. g) = (\lambda t. g)$$
(результаты, понятное дело, обязаны совпасть в силу теоремы Черча-Россера и единственности нормальной формы с точностью до альфа эквивалетности).

Неужели все так просто? Получается, что вся разница между ленивыми и энергичными вычислениями - это с каких редексов стартовать, соответственно, с внешнего или с внутренних (первая строчка - ленивые вычисления, вторая - энергичные)

 Профиль  
                  
 
 Re: Ленивые вычисления
Сообщение27.05.2025, 15:54 
Заслуженный участник


07/08/23
1471
В целом всё так, если у вычислений нет побочных эффектов. Но избавление от повторного вычисления выражений — это уже другая задача.

 Профиль  
                  
 
 Re: Ленивые вычисления
Сообщение27.05.2025, 17:34 


22/10/20
1265
dgwuqtj в сообщении #1687758 писал(а):
В целом всё так, если у вычислений нет побочных эффектов.
Да, речь про чистые функции.

До меня еще вот какой момент дошел. Есть модельный пример лямбда выражения: $$ (\lambda x. y)((\lambda x. x x x)(\lambda x. x x x))$$
Если его вычислять энергично (с внутренних редексов), то программа будет вычислять его вечно: $$(\lambda x. y)((\lambda x. x x x)(\lambda x. x x x)) = (\lambda x. y)((\lambda x. x x x)(\lambda x. x x x)(\lambda x. x x x)) = $$ $$ = (\lambda x. y)((\lambda x. x x x)(\lambda x. x x x)(\lambda x. x x x)(\lambda x. x x x)) = \text{и так далее до бесконечности}$$

А если вычислять лениво, то оно редуцируется в один шаг: $$(\lambda x. y)((\lambda x. x x x)(\lambda x. x x x)) = y$$ (всего одна $\beta$-редукция).

Я при первом чтении как-то об этом не подумал, но по сути аналогичный пример можно ведь придумать и в математике. Например, хотим мы вычислить дробь $\frac{8\sqrt{2}}{4\sqrt{2}}$, где корень будет вычисляться через какую-нибудь итеративную процедуру. Для полных квадратов процедура заканчивалась бы, и дробь можно было бы вычислить обычным энергичным способом, но с корнем из 2 так не получится, потому что оно иррациональное число, и процедура будет считать его вечно. А ленивым методом - просто взяли сократили дробь на $\sqrt{2}$, поделили 8 на 4 и получили ответ. Та же самая идея: внутренний редекс считается бесконечно, но для результата он не нужен.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Geen, YandexBot [bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group