Тверской государственный университет
Опубликован: 21.08.2007 | Доступ: свободный | Студентов: 1683 / 243 | Оценка: 5.00 / 5.00 | Длительность: 14:18:00
ISBN: 978-5-94774-714-0
Специальности: Программист, Математик
Лекция 2:

Реализация булевых функций с помощью логических схем

< Лекция 1 || Лекция 2: 123 || Лекция 3 >

Схемы и линейные программы

Указанное выше свойство характерно и для программ, в которых один раз вычисленное значение выражения можно использовать неоднократно. Рассмотрим один из простейших классов программ - линейные или неветвящиеся программы. Такие программы представляют последовательности присваиваний вида:

X = F(X_1, \ldots , X_k),

где X, X1, ... , Xk - переменные, F - имя k -местной базисной функции.

В случае нашего базиса B_{0}=\{  \wedge , \vee , \neg \} линейная программа состоит из присваиваний вида: Z = X \wedge  Y, Z = X \vee  Y и Z = \neg  X.

Линейная программа P с выделенными входными переменными X1, ... , Xn порождает для каждого набора \sigma _{1}, \dots , \sigma _{n} значений входных переменных естественный процесс вычисления: вначале переменным X1, ... , Xn присваиваются значения \sigma _{1}, \dots , \sigma _{n}, соответственно, а каждой из остальных переменных присваивается значение 0. Затем последовательно выполняются присваивания программы P, в результате чего каждая из переменных Z программы получит заключительное значение P_{Z}(\sigma _{1}, \dots , \sigma _{n}).

Определение 2.6. Скажем, что программа P со входными переменными X1, ... , Xn вычисляет в выходной переменной Z функцию F(X1, ..., Xn), если для любого набора значений входов \sigma _{1}, \dots , \sigma _{n} после завершения работы P_{Z}(\sigma _{1}, \dots , \sigma _{n})=F(\sigma _{1}, \dots , \sigma _{n}).

Между схемами и линейными программами имеется тесная связь.

Теорема 2.1.

  1. По каждой логической схеме S со входами x1, ... , xn и функциональными элементами v1, ..., vm можно эффективно построить линейную программу PS со входными переменными x1, ... , xn и рабочими переменными v1, ..., vm, которая в любой переменной vi, i=1,...,m, вычисляет функцию f_{v_i}(x_1, \ldots, x_n).
  2. По каждой линейной программе P со входными переменными X1, ... , Xn, вычисляющей в выходной переменной Z некоторую функцию F(X1, ..., Xn) можно эффективно построить логическую схему SP со входами X1, ... , Xn, в которой имеется вершина v такая, что fv((X1, ..., Xn) = F(X1, ..., Xn).

Доказательство. (1) Пусть S - схема со входами x1, ... , xn и функциональными элементами v1, ..., vm. Построим по ней линейную программу PS со входными переменными x1, ... , xn следующим образом. Упорядочим все входные и функциональные вершины S по глубине (вершины одной глубины в любом порядке): u1, ..., un+m. Программа PS будет последовательностью m присваиваний.

  • Пусть вершина un+i помечена \neg и в нее входит
  • ребро из uj. Тогда в качестве i -ой команды поместим в PS присваивание u_{n+i}= \neg  u_{j}.
  • Пусть вершина un+i помечена \setminus circ \in  \{ \wedge , \vee \} и в нее входят ребра из uj и uk. Тогда в качестве i -ой команды поместим в PS присваивание u_{n+i}=  u_{j} \hat{}  u_{k}.

Упорядочение вершин по глубине гарантирует, что j <n+ i и k <n+ i. Поэтому при вычислении u_{n+i} значения аргументов уже получены и индукцией по глубине легко показать, что для каждого i=1,...,m программа PS вычисляет в переменной vi функцию f_{v_i}(x_1, \dots, x_n).

Доказательство пункта (2) проведите самостоятельно (см. задачу 2.1).

Пример 2.1. Применим конструкцию теоремы к схеме S1, представленной на рис.2.1. Ее вершины можно упорядочить по глубине так: x, y, z, a, b, c, d, e, f. Порождая команды по описанным выше правилам, получим следующую линейную программу P_{S1}:

a = x \wedge y;\\
 b = \neg z; \\ c = \neg a;\\ d = c \wedge z;\\ e =a \wedge b;\\ f =d \vee e

Замечание. Число команд в линейной программе PS, т.е. время ее выполнения, совпадает со сложностью L(S) схемы S. Глубина схемы D(S) также имеет смысл с точки зрения времени вычисления. Именно, D(S) - это время выполнения PS на многопроцессорной системе. Действительно, все команды, соответствующие вершинам одинаковой глубины, можно выполнять параллельно на разных процессорах, так как результаты любой из них не используются в качестве аргументов другой.

< Лекция 1 || Лекция 2: 123 || Лекция 3 >