Выходное слово - последовательность выходных сигналов, выдаваемых автоматом. Состояния автомата - это комбинации состояний запоминающих элементов устройства.
Однако даже с прикладной точки зрения интерпретация автомата как устройства не является универсальной. Известно, что всякое вычислительное устройство можно реализовать как аппаратно (в виде устройства), так и программно (в виде программы для ЭВМ). Это приводит к более общему истолкованию автоматов как алгоритмов с конечной памятью, многие свойства которых можно исследовать безотносительно к способу их реализации.
Программная реализация логических функций и автоматов.
Представление автомата схемой из элементов - это исторически первый и наиболее исследованный вид структурной реализации автомата. Другой ее вид - реализация автомата программой. Здесь мы ограничимся вопросами программной реализации комбинационных логических автоматов, т. е. систем логических функций.
Под программой будем понимать пронумерованную последовательность команд k1, … , ks, взятых из некоторого фиксированного набора (системы команд). Программа работает над конечным множеством пронумерованных (или поименованных ) двоичных ячеек. Номер (или имя ) ячейки называется ее адресом ; именем ячейки часто будет служить имя логической переменной, значения которой хранятся в этой ячейке.
Система команд содержит команды-операторы вида b:=f(a1, … , ap) (выполнить операцию над содержимым ячеек a1, … , ap и результат положить в ячейку b ) и двухадресные условные переходы двух видов: 1) “если а, то i, иначе j ”( если a = 1, то перейти к выполнению команды kί , иначе перейти к kj ) ; 2 ) ” если ā ( a = 0 ) , то i , иначе j ”. Операция f ( a1 , . . . , ap ) - это логическая функция p переменных ; в частности, она может быть константой 0 или 1. Если j - номер следующей команды, то переход можно считать одноадресным : ” если a, то i, ( иначе перейти к следующей команде ) ”, а если i = j, то безусловным : ” перейти к i “. Любая из команд указанных типов может быть заключительной, что указывается словом ” конец “.
Процессом вычисления программы k1, . . . , ks называется последовательность шагов k ( 1 ), k ( 2 ), . . . , k ( t ), на каждом из которых выполняется одна команда программы. Эта последовательность определяется так : 1) k ( 1 ) = k1; 2) если k (1) = kr - оператор, то k ( i + 1 ) = kr+1 ; 3) если k ( 1 ) - условный переход, то номер команды k ( i + 1 ) указывается этим переходом; 4) если k ( i ) - заключительная команда, то процесс вычисления останавливается после ее выполнения. Число t называется временем ее выполнения.
Программа П вычисляет (или реализует ) логическую функцию f ( х1 , . . . , хn ) = у, если для любого двоичного набора σ = ( σ1 , . . . , σn ) при начальном состоянии памяти х1 = σ1 , х2 = σ2, . . . , хn = σn (состояние остальных ячеек несущественно ) программа через конечное число шагов останавливается и при этом в ячейке у лежит величина f ( σ1 , . . . , σn).
Если под сложностью схемы, реализующий автомат, обычно понимается число элементов в схеме, то сложность программы можно понимать в различных смыслах: 1) число команд в тексте программы; 2) объем промежуточной памяти, т.е. число ячеек для хранения промежуточных результатов вычислений; 3) время вычисления, которое будет характеризоваться двумя величинами: средним временем tср (П) =1/2n åτр(σ) и максимальным временем tмакс(П) = maxs τр(σ), где сумма и максимум берутся по всем 2n двоичным набором σ, а τр - время работы программы П на наборе σ.
Любой схеме, реализующей функцию f и содержащей N элементов, нетрудно поставить в соответствие программу, реализующую f и состоящую из N команд, следующим образом. Занумеруем элементы схемы числами 1,2, . . . , n так, чтобы на любом пути от входа к выходу номера элементов возрастали; при этом номер 1 получит один из входных элементов, а номер N - выходной элемент. Пусть элемент еί схемы реализует функцию φί и к его входам присоединены выходы элементов еj1, . . . , еjp ( некоторые из них, возможно, являются входами схемы). Поставим элементу еί в соответствие либо ячейку аί и команду аί = φί ( аj1 , . . . , аjp ), если ί ≠ N; либо ячейку у и команду << у : = φN( аj1, . . . , аjp ) конец >>, если ί = N. Получим программу, не содержащую условных переходов ( такие программы будем называть операторными ), в которой порядок команд в точности соответствует нумерации элементов в схеме, а система команд – базису схемы.
Проблемы синтеза операторных программ в основном сводятся к проблемам синтеза схем: в частности вопросы функциональной полноты системы команд и минимизации собственного текста операторной программы совпадают соответственно с задачами функциональной полноты системы функций и о минимизации схем. Поскольку операторная программа не содержит условных переходов, время ее вычисления на любом наборе одно и то же. Отсюда tmax = tcp = N, то есть оба вида временной сложности совпадают со сложностью текста программы, и, следовательно, при достаточно больших n почти для всех функций близки к 2n ⁄ n. Наоборот, проблема минимизации памяти ( за счет многократного использования одной ячейки для нескольких промежуточных результатов ) для операторных программ является нетривиальной комбинаторной задачей.
Другой ”крайний “ вид программ, вычисляющих логические функции, - программы, состоящие из команд вида у : = σ ( σ = 1 или σ = 0 ) и условных переходов. Такие программы называются бинарными программами. Всякую булеву функцию F , содержащую N букв, можно реализовать бинарной программой, вычисляющей F за время tmax = N и содержащей N команд условных переходов ( а также две команды у = 1 и у = 0, которые в оценках не участвуют ). Для описания метода реализации используем представление программы в виде графа в котором вершины соответствуют командам, а ребра – переходам. Пусть G1 - граф программы для функций f1 с начальной вершиной v10 и двумя заключительными вершинами v1z0 ( с командой у = 0 ) и v1z1 ( с командой у = 1 ) ; G2 - граф программы для f2 с началом v20 и концами v2z0 и v 2z1. Тогда: 1) программа, граф G которой получен присоединением G 2 к ”нулю“ G 1 ( то есть отождествлением вершин v 1z0 и v 201 ; команда у : = 1 при этом отбрасывается, вычисляют функцию f = f 1 / f 2; 2) программа, граф G которой получен присоединением G 2 к ”единице“ G 1 ( отождествляем v 1z1 и v20 ), вычисляет f = f 1 &f 2; 3) программа, граф которой получен из G 1 заменой команд в v 1z0 и v 1z1 на инверсные, вычисляет f 1. Заметим, что в графе G - две нулевые заключительные вершины. Их необходимо отождествлять.
Дата добавления: 2015-10-05; просмотров: 1000;