Введение

Техника, которая переплетает различные вычисления

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

Примеры

Рассмотрим дерево, которое потенциально содержит путь бесконечной длины (но каждый узел имеет лишь конечное число потомков): если в этой среде выполнить поиск в глубину, поиск может уйти по бесконечному пути и никогда не вернуться, потенциально оставив часть дерева неисследованной. Однако, если использовать поиск в ширину, существование бесконечного пути перестает быть проблемой: каждый узел посещается последовательно по уровням, в соответствии с его расстоянием от корня, поэтому бесконечный путь повлияет лишь на часть поиска, идущую по этому пути. Мы можем рассматривать это дерево как аналогию коллекции программ; в этом случае подход поиска в глубину соответствует запуску программ поочередно, переходу к следующей только после завершения текущей. Если одна из программ выполняется бесконечно долго, этот переход никогда не произойдет. Подход поиска в ширину, при котором каждый потомок на одном уровне дерева посещается по очереди, является примером переплетения (dovetailing), когда для каждой программы выполняется один шаг, прежде чем перейти к следующей. Таким образом, прогресс достигается в каждой программе, независимо от возможного существования программы, не завершающей свое выполнение. Другой пример – моделирование недетерминированной машины Тьюринга M детерминированной машиной (например, универсальной машиной Тьюринга). В этом случае необходимо использовать переплетение, если одна из ветвей вычислений M содержит бесконечный цикл.

Бесконечно много одновременных вычислений

В случае бесконечного числа программ, все потенциально бесконечно длинные, ни поиск в ширину, ни поиск в глубину не были бы достаточны для обеспечения прогресса по всем программам. Вместо этого можно использовать следующий подход: выполнить первый шаг первой программы; затем выполнить второй шаг первой программы и первый шаг второй программы; затем выполнить третий шаг первой программы, второй шаг второй программы и первый шаг третьей программы и так далее. Этот метод также известен как диагонализация (как, например, используется в пакете "universe" языка Haskell или монаде "Omega").

Этимология

Аналогия с переплетающимися концами шипового соединения в столярном деле.