Lex Kravetski (lex_kravetski) wrote,
Lex Kravetski
lex_kravetski

Categories:

Информация о списке внутри списка

Интересно, что не только мне в комментах русскоязычные типа знатоки математики такое писали, но и в англоязычном сегменте интернета люди друг другу такое тоже пишут. Там, правда, это ещё и пытаются аргументировать, а не декларируют аки божье слово, даденное людям через откровение пророка, в роли коего выступал их вузовский преподаватель, но всё-таки пишут.

Что-де «а как же можно в множество сложить что-то там, что приобретает определённость только после построения этого множества?».

Надо отметить, что, например, Кантора такое вообще не смущало: он запросто искал в множестве элемент, который в принципе можно построить только после завершения построения этого множества. Но то, разумеется, Кантор — ему можно. А вот тем, кто анализирует его доказательство, уже нельзя. Наверно так.

Однако мне, как программисту со стажем, сама постановка вопроса «как можно?» в те времена, когда этим постоянно пользуются для написания программ, кажется абсурдной. Это всё равно, как если бы кто-то в 2021-м начал риторически вопрошать: «да осмысленна ли вообще идея летательных аппаратов тяжелее воздуха?!». Эй, алё, уже немножечко поздно сомневаться в возможности такового.

Ясен перец, вообще любая реализация «ленивых вычислений» позволит вам положить в контейнер некий элемент, который является результатом какой-то операции с этим контейнером. И это всё не гипотетические построения — вы можете написать такую программу, и она будет работать, по коей причине вопрос «возможно ли такое или мы где-то ошиблись в гипотезах?» тут же снимется.

Например, на Wolfram простейший вариант вот такой:

f = .;
list = {f} ~Join~ RandomInteger[10, RandomInteger[5]];
f = Length[list];


Заметьте, я тут специально кладу в список заранее неизвестное число случайных элементов — чтобы уж точно не было сомнений, что оно работает вовсе не потому, что «интерпретатор/компилятор что-то там соптимизировал».

Не, всё норм: положили в список некий символ на этапе построения этого списка, а после этого придали символу некий смысл. Смысл зависит от построенного списка, но никакого противоречия тут нет: всё сработает, причём ровно так, как ожидается.

Причём этот вариант не единственный. Можно было бы положить прямо сразу вызов некоторой функции или прямо её тело, инактивировав оные, а после построения списка активировав всё его содержимое. Или, например, положить в список ссылки на функции, вычисляющие соответствующий элемент, вместо самих элементов. Ленивые вычисления — распространённая штука, и в куче языков программирования реализованы те или иные способы их организовать.

Однако наличие даже хотя бы одного варианта хотя бы в одном языке уже говорит, что таки да, так можно. Причём говорит это гораздо более весомо, чем любые гипотетические рассуждения.

Дальше вопрос только в том, как именно и в каком порядке мы определяем «смыслы». В каких-то случаях у нас может возникнуть бесконечная рекурсия, например. А в каких-то других до следующей строки дело вообще никогда не дойдёт, поскольку предыдущая никогда не завершит вычисления. Ну да, если так, то хреновый у вас алгоритм. Пичалька.

Вы предполагаете, что можно «достроить» бесконечный список? Ну Ок. Тогда мы дойдём до третьей строки — всё в порядке. И в первом элементе списка будет лежать его длина — ну там, в виде константы Infinity или какого-нибудь алефа (кто не знает, это буковка из иврита такая, которой в комплекте с индексом обозначают гипотетические ещё более бесконечные бесконечности).

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

Это, блин, сегодняшняя реальность, а не гипотеза. Оно в куче мест уже встроено прямо в стандартную библиотеку — поздно сомневаться в возможности его реализации.

Если с вашей точки зрения на базе некоторого списка всегда можно построить какое-то число и до третьей строки мы обязательно дойдём, то пишите это число в неё после «f =», и оно будет в этом списке.

Этот практический код работает на практике, поэтому вопросы — к вашему воображаемому. Это в нём у вас бесконечная рекурсия, невычислимость и стопицот каких-то ещё возможных проблем.

Если для спасения вашей гипотезы вам в 2021-м надо постулировать невозможность существования самолётов, то это ваша гипотеза явно описывает какую-то альтернативную реальность, а вовсе не «самолёты существуют неправильно, поскольку не соответствуют моей мощной теории».



doc-файл

Tags: контрманипуляция сознанием, наука, программирование, философия
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 2 comments