Схемы из функциональных элементов

Теория

Представлению булевых функций формулами можно придать следующий "инженерно-конструктивный" смысл. Будем рассматривать формулу Ф(x1,..., xn) над каким-то произвольно фиксированным множеством F как "черный ящик", некое устройство, на вход которого подаются всевозможные наборы значений переменных, а на выходе появляются соответствующие этим наборам значения функции f, представляемой формулой Ф (рис. 6.22).

Рис. 6.22. Схемы из функциональных элементов

Чтобы понять, как устроен "черный ящик", мы должны разобрать процесс построения формулы из подформул. Добираясь до "базисных" подформул, т.е. элементов множества F, мы приходим к "кирпичикам", структурным элементам, из которых собран "черный ящик", вычисляющий функцию f. Каждая функция "базиса" F вычисляется соответствующим "узлом", который рассматривается как мельчайшая структурная единица нашего "черного ящика", и его внутренняя структура уже не анализируется.

Пример 6.22. Выберем в качестве множества F стандартный базис. Тогда формула над стандартным базисом, представляющая функцию ~ (эквивалентность), строится следующим образом:

Вычисление по этой формуле (и процесс ее построения из элементов стандартного базиса) можно схематически изобразить так, как показано на рис. 6.23.

Рис. 6.23. Схемы из функциональных элементов

Переменное х1 (точнее, значение этого переменного) подается на вход структурного элемента, называемого инвертором (рис. 6.24, а) и вычисляющего отрицание. Снимаемое с выхода инвертора отрицание х1, т.е. функция x1, подается на один из входов конъюнктора (рис. 6.24, б), на второй вход которого подается переменное х2. На выходе конъюнктора появляется функция x1х2. Аналогично прослеживается вычисление функции х1x2, Обе эти функции подаются на входы дизъюнктора (рис. 6.24, в), с выхода которого снимается функция х1x2х1x2 (это не что иное, как сумма по модулю 2: х1 ⊕ х2). И наконец, эта функция подается на вход инвертора, на выходе которого уже получается функция ~ (эквивалентность). #

Рис. 6.24. Схемы из функциональных элементов

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

Математически "схема" определяется как ориентированный граф специального вида, в котором и вершины, и дуги снабжены некоторыми метками.

Введем обозначение: если F - какое-то множество булевых функций, то через F(n) обозначаем подмножество F, состоящее из всех функций от n переменных (n≥0).

Определение 6.14. Пусть фиксированы множества: F (булевых функций) и Х (булевых переменных).

Схемой из фунпциональныж элементов над базисом F ∪ X (С Ф Э), или просто сжемой над базисом F ∪ X, также (F,Х)-схемой, называют бесконтурный ориентированный граф (т.е. сеть), каждая вершина которого помечена одним из элементов множества F U Х так, что выполняются следующие требования:

  1. каждый вход сети помечен либо некоторым переменным из Х, либо некоторой константой из F(0);
  2. если вершина v сети помечена функцией f от n переменных (т.е. f ∈ F(n)), то ее полустепень захода равна n, причем на множестве дуг, заходящих в вершину v, задана (взаимно однозначная) нумерация, при которой каждая дуга получает номер от 1 до n.

При изображении схем входы обозначаются кружочками, а вершины, не являющиеся входами, - треугольниками, внутри которых записано обозначение функции, помечающей даииую вершину. Выходы отмечаются "выходными" стрелками. На рис. 6.25 приведена СФЭ над базисом {|, х, у}.

Рис. 6.25. СФЭ над базисом {|, х, у}

Если базис подразумевается, то мы будем говорить просто "схема". Кроме того, если множество переменных фиксировано "раз и навсегда" и при рассмотрении различных схем мы меняем только множество функций F, то, как это мы делали, вводя понятия формулы и суперпозиции над заданным базисом, будем говорить о СФЭ над базисом F, полагая каждый раз, что подразумевается однажды фиксированное множество переменных Х, которое ( если это не вредит точности) не упоминается.

Определим теперь по индукции понятие булевой функции, вычисляемой вершиной схемы.

Определение 6.15. Пусть задана СФЭ S над базисом F ∪ Х, множество вершин которой есть V.

  1. Принимается, что каждый вход СФЭ вычисляет булеву функцию, которой он помечен (т.е. некоторое переменное или константу).
  2. Если вершина v ∈ V помечена функцией f ∈ F(n), заходящая в нее дуга с номером i (1≤i≤n) исходит из вершины ui ∈ V, которая вычисляет функцию gi, то вершина v вычисляет суперпозицию f(g1, ... ,gn).

Таким образом, если каждая вершина СФЭ над F вычисляет некоторую функцию, то порядок, в котором перечисляются функции g1, ... ,gn, подставляемые на места переменных функции f, в общем случае существен. Естественно назвать булеву функцию f от n переменных коммутативной, если она сохраняет значение при произвольной перестановке ее переменных. В этом случае мы можем не заботиться о нумерации дуг, заходящих в вершину схемы, помеченную такой функцией.

Пример 6.23. Рассмотрим СФЭ на рис. 6.25. Вершины v1 и v2 - входы СФЭ. Эти вершины вычисляют соответственно функции х и у. Тогда вершина v3, равно как и вершина v4, согласно определению 6.15, вычисляет функцию x|y (штрих Шеффера), а вершина v5 (выход сети) - функцию (x|y)l(x|y), которая, как известно, равна конъюнкции х · у.

Рис. 6.26. СФЭ

СФЭ, изображенная на рис. 6.26, имеет два выхода, вычисляющие функции (x|x)|(y|y) =x ∨ y и (x|y)|(x|y) =х·у.

Определение 6.16. Булева функция, вычисляемая СФЭ над базисом F ∪ Х, - это функция, вычисляемая каким-либо из ее выходов.

Таким образом, СФЭ вычисляет ровно стмько булевых функций, сколько имеет выходов. СФЭ на рис. 6.25 вычисляет одну функцию, а СФЭ на рис. 6.26 - две.

В общем случае, если {x1 ,..., xn} - множество всех переменных, которые служат метками входов схемы S над базисом F ∪ Х, имеющей m выходов, СФЭ S определяет отображение булева куба Bn в булев куб Bm, т.е. булев оператор.

Замечание 6.10. В некоторых случаях функцию, вычисляемую данной СФЭ, определяют несколько иначе, полагая, что это функция, вычисляемая любой вершиной из подмножества выделенных вершин СФЭ. В частности, это могут быть и выходы. В любом случае договоримся из выделенных (в только что указанном смысле) вершин схемы проводить "выходную" стрелку. #

Таким образом, каждая схема из функциональных элементов вычисляет некоторый булев оператор, в частности, если число выходов схемы равно 1, то она вычисляет некоторую булеву функцию.

Можно доказать и обратное: по любому булеву оператору может быть построена СФЭ над базисом F, где F - полное множество, вычисляющая данный оператор.

Пример 6.24. Зададим таблицей булев оператор, отображающий B3 в B2 (табл. 6.9).

Из таблицы легко увидеть, что

y1 = х1х2 ∨ х1х3 ∨ х2х3,

y2 = х1 ⊕ х2 ⊕ х3

(функция y1 есть не что иное, как мажоритарная функция от переменных х1 , х2 , х3 , и выше написана минимальная ДНФ для нее, см. пример 6.12).

Представим функцию y1 в базисе Жегалкина. Используя законы де Моргана, получим

(напомним, что сумма по модулю 2 любого четного числа равных слагаемых равна 0).

Итак,

y1 = х1х2 ⊕ х1х3 ⊕ х2х3 = х1х2 ⊕ х31 ⊕ х2).

СФЭ для булева оператора, заданного в табл. 6.9, над базисом Жегалкина приведена на рис. 6.27.

Рис. 6.27. СФЭ

При проектировании СФЭ полезно иметь в виду числовой параметр, называемый ее сложностью.

Сложность СФЭ - это число ее вершин, не являющихся входами.

Приведенная на рис. 6.27 СФЭ над базисом Жегалкина имеет сложность 5.

Рассмотрим теперь СФЭ для того же оператора над стандартным базисом.

По таблице (см. табл. 6.9) строим СДНФ для функции y2:

y2 = x1x2х3x1х2x3 ∨ х1x2x3 ∨ х1х2х3.

Карта Карно для этой функции, изображенная на рис. 6.28, показывает, что ее нельзя минимизировать (точнее, записанная выше СДНФ и есть минимальная ДНФ для этой функции). Но можно пойти по другому пути. Мы можем рассматривать табл. 6.9 как таблицу, определяющую частичную булеву функцию y2 = y21х2х3y1). Минимизируя эту функцию по

Рис. 6.28, Рис. 6.29. Карты Карно

карте Карно*, изображенной на рис. 6.29, получаем

* На этой карте мы оно обозначили наборы, на которых функция принимает значение 0, проставив нули в соответствующих клетках. Тем самым мы хотим еще раз зафиксировать внимание на том, что не следует путать нули с прочерками: прочерк в клетке карты, задающей частичную функцию, означает, что на данном наборе значение функции не определено, т.е. не равно ни 0, ни 1.

y2 = х1х2х3y11 ∨ х2 ∨ х3).

СФЭ над стандартным базисом для рассматриваемого булева оператора приведена на рис. 6.30. Сложность этой СФЭ составляет 11. Заметим, что вершина, вычисляющая функцию y1, не является выходом.

Рис. 6.30. СФЭ над стандартным базисом

Булев оператор, рассмотренный в этом примере, вычисляет двухразрядную сумму (по модулю 2) трех одноразрядных слагаемых. Его можно считать также одноразрядным двоичным сумматором - функциональным блоком многоразрядного двоичного сумматора - для двух слагаемых. Тогда функция y1 интерпретируетея как "сигнал переноса" в старший разряд. На рис. 6.31 изображено "соединение" трех СФЭ (таких, как показано на рис. 6.30), с помощью которого вычисляется сумма двух трехразрядных двоичных чисел. На третий вход сумматора для младшего разряда подается константа 0, а "сигнал переноса" старшего разряда есть старший разряд суммы, которая в общем случае будет четырехразрядным числом.

Рис. 6.31. Соединение трех СФЭ

Замечание 6.11. Если мы проектируем СФЭ над стандартным базисом и хотим минимизировать ее сложность, то нам необходимо прежде всего построить соответствующую минимальную ДНФ. В этом случае мы може м принять во внимание еще один критерий, по которому минимизируется сама ДНФ, - число отрицаний. Среди всех минимальных (в смысле определения 6.6) ДНФ следует отобрать те, в которых число вхождений переменных под знаком отрицания является наименьшим. С точки зрения сложности СФЭ, которая будет построена по минимальной ДНФ, это означает, что в ней минимизируется число "инверторов" - вершин СФЭ, помеченных функцией отрицания.

Рис. 6.32. Карта Карно

Например, для функции, заданной картой Карно (рис. 6.32), к ядру, состоящему из простых импликант х1х2х4 и x1х3x4, следует добавить простую импликанту х2х3х4, а не x1х2х3, поскольку она не содержит отрицаний.