Генераторы и не такая уж сводимость
![топ 100 блогов](/media/images/default.jpg)
Предположительно, нет. Поскольку из актуальной бесконечности может последовать существование незримых сусликов. Ведь достаточно ввести утверждение о том, что каких-то сущностей «больше», чем натуральных чисел, чтобы тут же из этого сделать вывод, что среди них с неизбежностью есть какие-то сущности, на которые сослаться принципиально нельзя, как и где-либо их обнаружить, поскольку для них просто не существует конечного текста, хоть как-то их идентифицирующего.
Однако сие скорее относится к философии, нежели к практике. В практике принципиально необнаружимое себя никак и никогда не проявит, считаем ли мы его «существующим» (в том странном смысле, который в этом случае мы приписали слову «существовать») или же не считаем (поскольку решили остаться с прежним смыслом, который подразумевает обязательную потенциальную возможность предъявить то, что сочли существующим).
А вот что будет отличаться в плане практики.
На практике мы можем создать некий контейнер, который будет хранить в себе какие-то заранее созданные элементы, но вот контейнер с бесконечным количеством заранее созданных элементов мы создать не можем.
Мы можем создать только бесконечный генератор, который при каждом запросе «следующий элемент» выдаёт нам следующий элемент. Часть этих элементов может где-то храниться, однако после какого-то по счёту запроса новые элементы мы будем вынуждены генерировать прямо на лету, поскольку заранее создать можно только конечное количество элементов.
Что отлично соответствует концепции потенциальной бесконечности, но не соответствует концепции актуальной.
Тем не менее, можем ли мы «для простоты рассуждений» считать, что этот контейнер как бы уже создан — ведь выглядит всё так, будто бы снаружи невозможно отличить, были ли эти элементы созданы заранее или генерировались на лету?
Смотрите, в чём штука.
Генератор по своему интерфейсу не отличается от итератора: у него тоже две команды «дай следующий элемент» и «есть ли следующий элемент?». Поэтому мы можем считать генератор частным случаем итератора.
Если у нас есть два конечных контейнера, полагаемых нами конечными множествами, то мы можем реализовать операцию «объединение множеств» совершенно тривиальным способом: создать ещё один контейнер, в который мы сложим все элементы двух этих.
Итератор по этому новому контейнеру автоматически будет и итератором по объединению множеств.
Однако, что нам делать, если одно из множеств потенциально бесконечное, а потому контейнером представлено быть не может — только генератором?
Единственный наш вариант в этом случае — реализовывать объединение множеств через ещё один итератор. В который при создании будут переданы итераторы двух исходных множеств.
Такое подойдёт и для множеств, которые конечные контейнеры (для них мы возьмём итератор по этому контейнеру), и для множеств, которые потенциально бесконечные (для них мы возьмём сам их генератор, который тоже итератор).
И теперь, смотрите, следующий шаг.
Как бы реализация объединительного итератора ни брала элементы из двух контейнеров, рано или поздно мы обойдём их все — главное, чтобы она не прекращала брать элементы, пока это всё ещё возможно хоть для какого-то из контейнеров.
Но если одно из множеств представлено генератором, то расклад меняется.
Понятно, что мы никогда не обойдём все элементы — их генерация ведь никогда не прекратится.
Однако нас всё ещё может интересовать вопрос, верно ли, что до любого элемента каждого из множеств мы рано или поздно дойдём этим итератором?
В случае с конечными контейнерами ответ: «да» — ведь мы рано или поздно переберём все их элементы.
Введи мы «для простоты рассуждений» актуальные бесконечности, ответ тоже был бы «да», если они «перечислимы» — ведь в объединении множеств уже лежат все элементы двух исходных множеств, а перечислимость означает, что в каждом множестве по отдельности мы можем добраться до любого элемента.
Но вот для потенциально бесконечных генераторов, в отличие от воображаемых актуально бесконечных множеств, ответ: может быть да, а может быть нет — зависит от реализации объединительного итератора.
Мы можем реализовать его так, что он по очереди запрашивает элемент то у одного, то у другого итератора, а когда один из них начнёт говорить «следующего элемента нет» — будет запрашивать только у другого, пока элементы не кончатся и там.
А можем реализовать его так, что он запрашивает элементы у первого итератора, пока он не скажет «следующего нет», после чего начнёт запрашивать у второго.
Так вот, если первый итератор — бесконечный генератор, то первая реализация всё равно будет гарантировать нам, что мы рано или поздно получим какой угодно элемент каждого из множеств. А вторая — что мы никогда не получим ни один элемент из второго итератора, ведь элементы первого никогда не кончатся, а потому до второго дело никогда не дойдёт.
Иными словами, если первый генератор последовательно генерирует нечётные натуральные числа, а второй — чётные, то вторая реализация итератора гарантирует нам, что он никогда не вернёт чётное число, хотя вроде бы мы передали в него «множество чётных чисел» для объединения с «множеством нечётных».
То есть, внезапно, вот эта вот гарантия — возможность дойти до какого угодно элемента — зависит не только от самих множеств, но и от того, как мы имитируем их объединение.
Множества могут быть вполне перечислимы (а точнее, в парадигме потенциальной бесконечности иначе и быть не может, поскольку бесконечные множества там можно представить только генераторами), но от способа объединения генераторов зависит, можно ли рано или поздно добраться до любого их элемента или нельзя.
Но, разумеется, это всё несущественно — ведь актуальная бесконечность нужна тем, кто никаких программ даже и не собирался писать, а потому разбираться с сим печальным нюансом ему никогда не доведётся.
В этой красивой и простой математической вселенной чётные и нечётные числа просто объединяются в перечислимое множество магическим способом. Раньше все они лежали в разных местах, а теперь стали лежать в одном — уже готовые. Поэтому нет смысла задаваться вопросом, каким именно образом мы когда-нибудь переберём все нечётные числа, чтобы потом приступить к чётным.
Because of magic — вы просто не умеете мыслить абстрактно.
doc-файл
|
</> |