- •Часть 1.
- •Оглавление
- •1. Модели дискретных структур. Комбинационные схемы
- •1.1. Введение
- •1.2. Функции алгебры логики
- •Коммутативность
- •Ассоциативность
- •Дистрибутивность
- •1.3. Булева алгебра. Функциональная полнота
- •Свойства алгебры Жегалкина
- •1.4. Минимизация функции алгебры логики
- •1.5. Функции k-значной логики
- •1.6. Основные понятия трехзначной логики
- •1.7. Представление k-значных функций в виде нормальных форм
- •1.8. Двоичное кодирование переменных и функций трехзначной логики
- •1.9. Программная реализация логических функций и автоматов
- •2. Формальные языки и грамматики
- •2.1. Введение в теорию формальных языков и грамматик
- •2.2. Выводы цепочек формального языка. Деревья ксг
- •2.3. Основные понятия теории формальных языков и грамматик
- •2.4. Приведение грамматик
- •2.4. Операции над языками
- •2.5. Право-линейная и автоматная грамматики
- •3. Теория автоматов
- •3.1. Введение
- •3.2. Способы представления конечных автоматов
- •3.3. Минимизация числа состояний автомата
- •3.4. Использование сети Петри при переходе от грамматики к автомату
- •3.5. Сети Петри. Маркировка
- •3.6. Классификация сетей Петри
- •Статические ограничения
- •3.7. Синхронные и асинхронные автоматы
- •3.8. Модели автоматов Мили и Мура
- •3.9. Кодирование автомата
- •3.10. Элементная база синтеза комбинационных схем
- •3.11. Структурный синтез автомата
- •4. Отдельные вопросы теории вычислительных процессов
- •4.1. Автоматы с магазинной памятью
- •4.2. Комбинационные схемы обнаружения ошибок
- •4.3. Пространство сообщений. Коды обнаружения и исправления ошибок
- •Контрольные вопросы
1.9. Программная реализация логических функций и автоматов
Представление автомата схемой, состоящей из логических элементов наиболее исследованный вид структурной реализации автомата. Другой ее вид - реализация программой. Программа вычисляет (реализует) логические функции f(x1, ..., xn) = y, если для любого двоичного набора 1,..., n ) при начальном состоянии элементов памяти x1 = 1 , x2 = 2 ,..., xn = n программа через конечное число шагов останавливается и в ячейке y лежит величина f(1, 2, ..., n ). Если под сложностью схемы, реализующей автомат, обычно понимается число элементов схемы, то под сложностью программ можно понимать:
число команд в тексте программы;
объем промежуточной памяти;
время вычисления программы, которое характеризуется двумя величинами:
Средним временем
Максимальным временем ,
где сумма и максимум берутся по всем 2 наборам, а p - время работы программы на одном наборе .
Рассмотрим 2 типа программ: операторные и бинарные. Операторная программа не содержит условных переходов, порядок ее команд в точности соответствует нумерации элементов в схеме, а система команд соответствует базису схемы. Элементы схемы нумеруются числами 1,..., n таким образом, чтобы на любом пути от входа к выходу номера элементов возрастали. При этом номер 1 получит один из входных элементов, а номер n - выходной элемент.
Пусть элемент схемы ei реализует функцию i и к его входам присоединены выходы элементов ej1 , e j2 , ..., e jm (некоторые из них, возможно, являются входами схемы ), тогда выход такого элемента можно записать:
ai = i ( ej1 , e j2, ..., e jm ) при i n, а выход схемы может быть записан: y = i( ej1, e j2, ..., e jm ) при i = n. Такая программа будет реализовывать работу заданной схемы. Проблема синтеза операторных программ сводится к проблеме синтеза схем, то есть к вопросам функциональной полноты и минимизации схем. Поскольку операторная программа не содержит условных переходов, то время ее выполнения на любом наборе одно и то же, отсюда
t max = t ср.
Бинарные программы это программы, состоящие из команд типа y = ; = {0, 1} и условных переходов.
Замечание. Бинарные программы обладают двумя достоинствами по сравнению с операторными:
Отсутствием промежуточной памяти в процессе работы программы. Это позволяет реализовать бинарную программу на постоянных элементах памяти.
Более высоким быстродействием.
Пример. Составить для функции f = x1 v x2 бинарную и операторную программы.
Решение. Воспользуемся языком С++, будем иметь код:
void main()
{
bool f=0, x1,x2 ; // описание типа переменных
cout<<” Enter x1,x2\n”; // вывод на экран текста
cin>> x1>>x2; // ввод переменных
switch (x1) // оператор выбора
{
case 0: switch(x2)
{
case 0: f=1;
case 1: f=0;
}
case 1: f=1;
}
default: f=0;
cout>> ”\n f = “<<f ;
getch();
}
Операторная программа пишется в базисе {&,}. Для этого перепишем заданную функцию, используя формулы де Моргана.
void main()
{
bool f, x1,x2 ; // описание типа переменных
bool a,b;
cout<<” Enter x1,x2\n”; // вывод на экран текста
cin>> x1>>x2; // ввод переменных
a= 1-x1; { }
b= a x2; { }
b= 1 - b; { }
f=b;
cout>> ”\n f = “<<f ;
getch();
}
Контрольный вопрос. Определить к какому типу программ относится программа, фрагмент которой представлен оператором:
f = (x1) OR ( NOT (x3)) AND ((x5) AND (NOT (x4)));