stringtranslate.com

Счетчик машина

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

Основные характеристики

Для данной модели счётной машины набор команд невелик — от одной до шести-семи инструкций. Большинство моделей содержат несколько арифметических операций и хотя бы одну условную операцию (если условие истинно, то переход). Три базовые модели , каждая из которых использует три инструкции, взяты из следующей коллекции. (Сокращения произвольны.)

Кроме того, машина обычно имеет команду HALT, которая останавливает машину (обычно после вычисления результата).

Используя упомянутые выше инструкции, различные авторы обсуждали определенные счетчиковые машины:

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

Альтернативные названия, альтернативные модели

Модели счетчиковых машин носят разные названия, которые могут помочь отличить их по особенностям. Ниже инструкция «JZDEC ( r )» представляет собой составную инструкцию, которая проверяет, пуст ли регистр r; если да, то перейдите к инструкции I z , в противном случае уменьшите содержимое r:

Формальное определение

Счетная машина состоит из:

  1. Помеченные неограниченные целочисленные регистры : конечный (или бесконечный в некоторых моделях) набор регистров r 0  ...  r n , каждый из которых может хранить любое одно неотрицательное целое число (0, 1, 2, ... - т.е. неограниченное). ). Регистры выполняют свою собственную арифметику; может быть или не быть один или несколько специальных регистров, например, «аккумулятор» ( подробнее об этом см. В разделе «Машина с произвольным доступом» ).
  2. Регистр состояния , который хранит/идентифицирует текущую команду, подлежащую выполнению. Этот регистр конечен и отделен от приведенных выше регистров; таким образом, модель счётной машины является примером Гарвардской архитектуры.
  3. Список помеченных последовательных инструкций : Конечный список инструкций I 0  ...  I m . Хранилище программ (инструкции конечного автомата ) не находится в том же физическом «пространстве», что и регистры. Обычно, но не всегда, как и в компьютерных программах, инструкции перечислены в последовательном порядке; если прыжок не окажется успешным, последовательность по умолчанию продолжается в числовом порядке. Каждая инструкция в списке входит в (очень) небольшой набор, но этот набор не включает косвенность. Исторически сложилось так, что большинство моделей черпали инструкции из этого набора:
{ Приращение (r), Уменьшение (r), Очистка (r); Копирование (r j ,r k ), условный переход, если содержимое r=0, условный переход, если r j =r k , безусловный переход, HALT }
Некоторые модели либо дополнительно раздробили некоторые из вышеперечисленных инструкций на инструкции без параметров, либо объединили их в одну инструкцию, например «Уменьшение», которой предшествует условный переход при нуле «JZ (r, z)». Атомизация инструкций или включение удобных инструкций не приводит к изменению концептуальной силы, поскольку любую программу в одном варианте можно напрямую перевести в другой.
Альтернативные наборы команд обсуждаются в дополнении «Модели регистровых машин ».

Пример: КОПИРОВАТЬ счетчик из регистра №2 в №3.

В этом примере показано, как создать еще три полезные инструкции: очистить , безусловный переход и копирование .

После этого r будет содержать исходное значение счетчика (в отличие от MOVE, которое очищает исходный регистр, т . е. обнуляет его).

Базовый набор (1) используется, как определено здесь:

Первоначальные условия

Первоначально регистр №2 содержит «2». Регистры №0, №1 и №3 пусты (содержат «0»). Регистр №0 остается неизменным во время вычислений, поскольку он используется для безусловного перехода. Регистр №1 — это блокнот. Программа начинается с инструкции 1.

Окончательные условия

Программа останавливается, при этом содержимое регистра №2 соответствует исходному значению, а содержимое регистра №3 равно исходному содержимому регистра №2, т.е.

[2] = [3].

Общее описание программы

Программа COPY (#2, #3) состоит из двух частей. В первой части программа перемещает содержимое исходного регистра №2 как в блокнот №1, так и в регистр назначения №3; таким образом, №1 и №3 будут копиями друг друга и исходного счетчика в №2, но №2 очищается в процессе уменьшения его до нуля. Безусловные переходы J(z) выполняются проверками регистра №0, который всегда содержит число 0:

[#2] →#3; [#2] →#1; 0 →#2

Во второй части программа перемещает (возвращает, восстанавливает) содержимое блокнота №1 обратно в блокнот №2, очищая при этом блокнот №1:

[#1] →#2; 0 →#1

Программа

Программа, выделенная желтым цветом, отображается слева направо в правом верхнем углу.

«Запуск» программы показан ниже. Время бежит вниз по странице. Инструкции выделены желтым цветом, регистры — синим. Программа перевернута на 90 градусов: номера команд (адреса) расположены вверху, мнемоника инструкций — под адресами, а параметры команд — под мнемониками (по одному на ячейку):

Частично рекурсивные функции: построение «удобных инструкций» с помощью рекурсии

В приведенном выше примере показано, как первые базовые инструкции { INC, DEC, JZ } могут создать еще три инструкции — безусловный переход J, CLR, CPY. В некотором смысле CPY использовал и CLR, и J плюс базовый набор. Если бы регистр №3 изначально имел содержимое, сумма содержимого №2 и №3 оказалась бы в №3. Таким образом, чтобы быть полностью точным, программа CPY должна была предварять свои действия CLR (1) и CLR (3).

Однако мы видим, что ADD было бы легко возможно. Фактически, ниже приводится краткое изложение того, как могут возникать примитивные рекурсивные функции , такие как ADD, MULTiply и EXPonent (см. Boolos-Burgess-Jeffrey (2002), стр. 45-51).

{ J, DEC, INC, JZ, H }
{ CLR, J, DEC, INC, JZ, H }
{ CPY, CLR, J, DEC, INC, JZ, H }
Вышеупомянутый набор команд Шепердсона-Стерджиса (1963).
{ ADD, CPY, CLR, J, DEC, INC, JZ, H }
{ MUL, ADD, CPY, CLR, J, DEC, INC, JZ, H }
{ EXP, MUL, ADD, CPY, CLR, J, DEC, INC, JZ, H }

В общем, мы можем построить любую частично или полностью примитивную рекурсивную функцию , используя одни и те же методы. Действительно, Мински (1967), Шепердсон-Стерджис (1963) и Булос-Берджесс-Джеффри (2002) демонстрируют, как сформировать пять примитивных рекурсивных функций «операторов» (1-5 ниже) из базового набора (1).

А как насчет полной эквивалентности по Тьюрингу ? Нам нужно добавить шестой оператор — оператор μ — чтобы получить полную эквивалентность, способную создавать тотально- и частично- рекурсивные функции :

  1. Нулевая функция (или постоянная функция)
  2. Функция-преемник
  3. Функция идентификации
  4. Функция композиции
  5. Примитивная рекурсия (индукция)
  6. оператор μ (оператор неограниченного поиска)

Авторы показывают, что это легко сделать в рамках любого из доступных базовых наборов (1, 2 или 3) (пример можно найти в операторе µ ). Это означает, что любая мю-рекурсивная функция может быть реализована как счётная машина [1] , несмотря на конечный набор команд и размер программы конструкции счётной машины. Однако требуемая конструкция может быть нелогичной даже для функций, которые относительно легко определить в более сложных регистровых машинах, таких как машина с произвольным доступом . Это связано с тем, что оператор μ может выполнять итерацию неограниченное количество раз, но любая машина-счетчик не может обращаться к неограниченному числу различных регистров из-за конечного размера ее списка команд.

Например, приведенная выше иерархия примитивно-рекурсивных операторов может быть дополнительно расширена после возведения в степень до операций со стрелками более высокого порядка в нотации Кнута со стрелкой вверх . Для любого фиксированного функция является примитивно-рекурсивной и может быть реализована как счетчик-машина простым способом. Но функция не является примитивно-рекурсивной. У кого-то может возникнуть соблазн реализовать оператор стрелки вверх, используя конструкцию, аналогичную приведенным выше инструкциям преемника, сложения, умножения и возведения в степень, путем реализации стека вызовов , чтобы функцию можно было применять рекурсивно к меньшим значениям . Эта идея аналогична тому, как можно реализовать эту функцию на практике во многих языках программирования. Однако машина-счетчик не может использовать в своих вычислениях неограниченное количество регистров, что было бы необходимо для реализации стека вызовов, который может стать сколь угодно большим. Операцию со стрелкой вверх все еще можно реализовать как счетную машину, поскольку она является мю-рекурсивной, однако функция будет реализована путем кодирования неограниченного объема информации внутри конечного числа регистров, например, с использованием нумерации Гёделя .

Проблемы с моделью счетчика машины

Проблемы подробно рассмотрены в статье Машина произвольного доступа . Проблемы делятся на два основных класса и третий класс «неудобств»:

(1) Неограниченная емкость регистров в сравнении с ограниченной емкостью инструкций конечного автомата: как машина будет создавать константы, превышающие емкость ее конечного автомата?

(2) Неограниченное количество регистров в сравнении с ограниченным количеством инструкций конечного автомата: как машина будет получать доступ к регистрам с номерами адресов, находящимися за пределами досягаемости/возможностей ее конечного автомата?

(3) Полностью сокращенные модели громоздки:

Шепердсон и Стерджис (1963) не извиняются за свой набор из шести команд. Они сделали свой выбор, основываясь на «простоте программирования... а не на экономии» (стр. 219, сноска 1).

Инструкции Шепердсона и Стерджиса ([r] означает «содержимое регистра r»):

Мински (1967) расширил свой набор из двух команд { INC (z), JZDEC (r, I z ) } до { CLR (r), INC (r), JZDEC (r, I z ), J (I z ) } до того, как он доказал, что «универсальную программную машину» можно построить только с двумя регистрами (стр. 255 и далее).

Машины с двумя счетчиками эквивалентны Тьюрингу (с оговоркой).

Для каждой машины Тьюринга существует 2CM, который ее моделирует, при условии, что входные и выходные данные 2CM правильно закодированы. Это доказано в книге Мински ( Computation , 1967, стр. 255-258), а альтернативное доказательство представлено ниже в три этапа. Во-первых, машину Тьюринга можно смоделировать с помощью конечного автомата (автомата), оснащенного двумя стеками. Тогда два стека можно смоделировать четырьмя счетчиками. Наконец, четыре счетчика могут быть смоделированы двумя счетчиками. Машина с двумя счетчиками использует набор инструкций { INC ( r, z ), JZDEC ( r, z true , z false ) }.

Шаг 1. Машину Тьюринга можно смоделировать двумя стеками.

Машина Тьюринга состоит из автомата и бесконечной ленты, изначально заполненной нулями, на которую машина может записывать единицы и нули. В любой момент головка чтения/записи устройства указывает на одну ячейку на ленте. В этот момент эту ленту концептуально можно разрезать пополам. Каждую половину ленты можно рассматривать как стек , где верхняя часть — это ячейка, ближайшая к головке чтения/записи, а нижняя — на некотором расстоянии от головки, причем все нули на ленте находятся за нижней частью. Соответственно, машину Тьюринга можно смоделировать с помощью автомата плюс два стека. Перемещение головы влево или вправо эквивалентно тому, чтобы вытащить кусочек из одной стопки и переместить ее в другую. Запись эквивалентна изменению бита перед его нажатием.

Шаг 2: Стек можно смоделировать двумя счетчиками.

Стек, содержащий нули и единицы, можно моделировать с помощью двух счетчиков, если считать, что биты в стеке представляют двоичное число (самый верхний бит в стеке является наименее значащим битом). Занесение нуля в стек эквивалентно удвоению числа. Нажатие единицы эквивалентно удвоению и добавлению 1. Удаление эквивалентно делению на 2, где остаток — это извлеченный бит. Два счетчика могут моделировать этот стек, в котором один из счетчиков хранит число, двоичное представление которого представляет биты в стеке, а другой счетчик используется в качестве блокнота. Чтобы удвоить число в первом счетчике, автомат может инициализировать второй счетчик нулем, затем несколько раз уменьшить первый счетчик один раз и дважды увеличить второй счетчик. Это продолжается до тех пор, пока первый счетчик не достигнет нуля. В этот момент второй счетчик будет содержать удвоенное число. Уполовинивание выполняется путем уменьшения одного счетчика дважды и увеличения другого один раз, и повторяется до тех пор, пока первый счетчик не достигнет нуля. Остаток можно определить по тому, достиг ли он нуля после четного или нечетного числа шагов, причем четность количества шагов кодируется в состоянии автомата.

Шаг 3: Четыре счетчика могут быть смоделированы двумя счетчиками.

Как и раньше, один из счетчиков используется в качестве блокнота. Другой содержит целое число , простая факторизация которого равна 2 a 3 b 5 c 7 d . Показатели степени a , b , c и d можно рассматривать как четыре виртуальных счетчика, которые упакованы (посредством нумерации Гёделя ) в один реальный счетчик. Если реальный счетчик установлен на ноль, а затем увеличен один раз, это эквивалентно установке на ноль всех виртуальных счетчиков. Если реальный счетчик удвоен, это эквивалентно увеличению a , а если он уменьшен вдвое, это эквивалентно уменьшению a . По аналогичной процедуре его можно умножить или разделить на 3, что эквивалентно увеличению или уменьшению b . Аналогично, c и d можно увеличивать или уменьшать. Чтобы проверить, равен ли нулю виртуальный счетчик, такой как c , просто разделите реальный счетчик на 5, посмотрите, каков остаток, затем умножьте на 5 и прибавьте остаток. Это оставляет реальный счетчик неизменным. Остаток будет ненулевым тогда и только тогда, когда c было равно нулю.

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

Предостережение: *Если* его счетчики инициализированы значениями N и 0, то 2CM не может вычислить 2 N.

Этот результат вместе со списком других функций N , которые не могут быть вычислены машиной с двумя счетчиками ( при инициализации N в одном счетчике и 0 в другом ), таких как N 2 , sqrt( N ), log 2 ( N ) и т. д., появляется в статье Шрёппеля (1972). Результат неудивителен, потому что модель машины с двумя счетчиками была доказана (Минским) как универсальная только тогда, когда аргумент N соответствующим образом закодирован (путем Гёделизации) для имитации машины Тьюринга, исходная лента которой содержит N , закодированное в унарном виде; более того, выходные данные машины с двумя счетчиками будут закодированы аналогичным образом. Это явление типично для очень маленьких баз вычислений, универсальность которых доказывается только моделированием (например, множество « тарпитов Тьюринга» , наименьших известных универсальных машин Тьюринга и т. д.).

Доказательству предшествует несколько интересных теорем:

Что касается второй теоремы о том, что «3CM может вычислить любую частично рекурсивную функцию», автор бросает читателю «сложную задачу: умножить два числа, используя только три счетчика» (стр. 2). Основное доказательство связано с представлением о том, что машины с двумя счетчиками не могут вычислять арифметические последовательности с нелинейными темпами роста (стр. 15), т.е. «функция 2 X растет быстрее, чем любая арифметическая прогрессия». (стр. 11).

Практический пример расчета путем подсчета

Калькулятор Friden EC-130 не имел сумматорной логики как таковой. Его логика была очень последовательной: арифметика выполнялась путем счета. Внутри десятичные цифры имели систему счисления 1 — например, шестерка была представлена ​​шестью последовательными импульсами в пределах временного интервала, отведенного для этой цифры. Каждый временной интервал содержал одну цифру, начиная с наименее значимой. Кэрри устанавливает триггер, который приводит к добавлению одного отсчета к цифре в следующем временном интервале.

Сложение осуществлялось восходящим счетчиком, а вычитание - обратным счетчиком, с аналогичной схемой работы с заимствованиями.

Схема временных интервалов определяла шесть регистров по 13 десятичных цифр, каждый со знаковым битом. Умножение и деление осуществлялись в основном путем многократного сложения и вычитания. Версия с квадратным корнем, EC-132, эффективно вычитала последовательные нечетные целые числа, причем каждое уменьшение требовало двух последовательных вычитаний. После первого уменьшаемое увеличивалось на единицу перед вторым вычитанием.

Смотрите также

Рекомендации

  1. ^ Булос-Берджесс-Джеффри (2002)
Ян ван Леувен , изд. Справочник по теоретической информатике. Том A: Алгоритмы и сложность , MIT PRESS/Elsevier, 1990. ISBN 0-444-88071-2 (том A). КА 76.H279 1990 г. 
Отношение ван Эмде Боаса к СММ представлено на стр. 32–35. Эта трактовка проясняет Шонхаге 1980 — она близко следует, но немного расширяет трактовку Шёнхаге. Обе ссылки могут быть необходимы для эффективного понимания.

Внешние ссылки

  1. ^ «Архивная копия» (PDF) . stedolan.net . Архивировано из оригинала (PDF) 14 февраля 2021 г.{{cite web}}: CS1 maint: архивная копия в заголовке ( ссылка )