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 ] 

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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