Содержание

Введение в булеву алгебру

 

1. Булева алгебра
2. Логическая интерпретация
3. Функциональная интерпретация
4. Интерпретация на множествах
5. Интерпретация на переключательных схемах
6. Программная модель многоразрядного двоичного сумматора


1. Булева алгебра

Булева алгебра - это формальная система, состоящая из множества M={0,1} и операций ~ (отрицание), & (конъюнкция) и | (дизъюнкция).

Операции определим с помощью таблиц:

A ~A
0 1
1 0
A B A | B A & B
0 0 0 0
0 1 1 0
1 0 1 0
1 1 1 1

Отметим, что операции ~, & и | отображают элементы множества M на само это множество.

Используя переменные, булевские операции и круглые скобки, можно строить булевские выражения. Например: A & ( B | ~A ) & ~B. При отсутствии скобок порядок выполнения операций определяется их приоритетами (по убыванию - ~, &, | ).

Для булевой алгебры справедливы следующие законы:

1. Закон коммутативности дизъюнкции: A | B = B | A .
2. Закон коммутативности конъюнкции: A & B = B & A .
3. Закон ассоциативности дизъюнкции: A | (B | C) = (A | B) | C .
4. Закон ассоциативности конъюнкции: A & (B & C) = (A & B) & C .
5. Закон дистрибутивности дизъюнкции относительно конъюнкции: A | (B & C) = (A | B) & (A | C) .
6. Закон дистрибутивности конъюнкции относительно дизъюнкции: A & (B | C) = (A & B) | (A & C) .
7. Первый закон поглощения: A | (A & B) = A .
8. Второй закон поглощения: A & (A | B) = A .
9. Первый закон де Моргана: ~(A | B) = ~A & ~B .
10. Второй закон де Моргана: ~(A & B) = ~A | ~B .
11. Закон идемпотентности дизъюнкции: A | A = A .
12. Закон идемпотентности конъюнкции: A & A = A .
13. Закон снятия двойного отрицания: ~~A = A .
14. Первый закон отбрасывания: A | (B & ~B) = A .
15. Второй закон отбрасывания: A & (B | ~B) = A .

Здесь под A и B понимаются любые булевские выражения.

Кроме того непосредственно с помощью таблиц можно убедиться в том, что
A | 0 = A, A | 1 = 1, A & 0 = 0, A & 1 = A.

В АЯ Pascal булева алгебра представлена типом Boolean, булевскими константами False и True, а также булевскими операциями not, and и or.

В качестве примера работы с булевскими операциями составим программу для экспериментальной проверки первого закона де Моргана.

program Morgan1;
var A,B: Boolean;
begin
for A:=False to True do
   for B:=False to True do
      if (not(A or B)) <> (not A and not B) then
         begin
         WriteLn('Morgan is liar.');
         Exit;
         end;
WriteLn('Morgan is right!');
end.

Если наша машина исправна и в программе нет ошибок, то на выходе мы должны получить:

Morgan is right!

2. Логическая интерпретация

Логическая интерпретация булевой алгебры позволяет использовать её аппарат для работы с логическими высказываниями. Логические значения "ложь" и "истина" соответствуют булевским 0 и 1. Логические связки НЕ, И, ИЛИ интерпретируются как операции ~, & и |, соответственно. Таблицы, которые мы использовали для определения булевских операций, в логике интерпретируются как таблицы истинности.

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

Название

Обозначение Определение
Импликация A->B ~A | B
Эквивалентность A=B ~A & ~B | A & B
Строгая дизъюнкция A<>B A & ~B | ~A & B

Высказывания, которые истинны при всех возможных значениях входящих в них переменных, называются тождественно истинными (универсально общезначимыми, тавтологичными). Примеры: A | ~A, ~(A | B) = ~A & ~B .

Высказывания, которые ложны при всех возможных значениях входящих в них переменных, называются тождественно ложными (противоречиями). Пример: A & ~A .

В языке Pascal булева алгебра по-существу представлена в логической интерпретации. Для представления дополнительных связок можно использовать операции сравнения. Учитывая, что   False < True, то в этой связи некоторые операции сравнения автоматически приобретают смысл логических связок: <= (импликация), = (эквивалентность), <> (строгая дизъюнкция).

3. Функциональная интерпретация

y = f(x1) - 4 функции,
y = f(x1, x2) - 16 функций. Здесь x1, x2 и y - принадлежат M. В общем случае
y = f(x1, x2, ..., xn) - 2^(2^n) функций.

Функция вида [~]x1 & [~]x2 & ... & [~]xn называется элементарной конъюнкцией. Она принимает значение 1 только на одном наборе значений аргументов. Для построения нужной функции достаточно построить дизъюнктивную форму из элементарных конъюнкций для тех наборов аргументов, на которых функция принимает значение 1. Такая форма называется дизъюнктивной нормальной формой (ДНФ).

В качестве примера построим функции для реализации одноразрядного двоичного сумматора: A, B - операнды, Ci - вход переноса, S - сумма, Co - выход переноса.

A B Ci S Co
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1

S = A&B&C | A&~B&~Ci | ~A&B&~Ci | ~A&~B&Ci,
Co = A&B | A&Ci | B&Ci.

В АЯ Pascal есть возможность определять булевы функции, которые зависят от булевых аргументов.

4. Интерпретация на множествах

1 - универсальное множество,
0 - пустое множество,
~A - дополнение множества A до 1,
A & B - пересечение множеств A и B,
A | B - объединение множеств A и B.

Для определения смысла операций рассмотрим пример. Предположим, что есть список группы студентов: 1) Вася, 2) Коля, 3) Лена, 4) Петя, 5) Оля. Далее для краткости мы будем обозначать их номерами из списка.

Универсальное множество в данном случае это множество всех студентов: [1, 2, 3, 4, 5].

Пустое множество: [].

Далее пусть A это множество студентов знающих язык Pascal. Предположим, что A = [1, 3, 4, 5]. A B - это множество студентов знающих язык C++. Предположим, что B = [1, 2, 3].

При сделанных предположениях ~A = [2] и ~B = [4, 5] - множества студентов, которые не знают Pascal и C++, соответственно. Таковы в данном случае дополнения множеств A и B до универсального множества.

A & B = [1, 3] - это множество, в которое входят элементы, входящие одновременно в оба множества-операнда операции пересечения. Очевидно, что в данном случае это множество студентов, владеющих обоими языками.

A | B = [1, 2, 3, 4, 5] - это множество, в которое входят элементы, входящие в любое из множеств-операндов операции объединения. В данном случае это множество студентов, владеющих хотя бы одним языком.

Убедимся в справедливости второго закона де Моргана ~(A & B) = ~A | ~B для множеств примера. С учетом ранее полученных результатов, ~(A & B) = ~ [1,3] = [2, 4, 5] и ~A | ~B = [2] | [4, 5] = [2, 4, 5] . Итак, для данного случая закон верен.

В АЯ Pascal предусмотрены средства для работы со множествами, но об этом мы поговорим позже.

5. Интерпретация на переключательных схемах

Реле. Переключательные схемы И, ИЛИ, НЕ.

LogCirc.bmp (70438 bytes)

На основе переключательных схем можно построить одноразрядный двоичный сумматор S1.

S1Circ.bmp (78682 bytes)

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

В десятичной системе счисления: 137 = 10^2 * 1 + 10^1 * 3 + 10^0 * 7.

Аналогично в двоичной системе счисления:

5 -> 0101, так как 5 = 2^3 * 0 + 2^2 * 1 + 2^1 * 0 + 2^0 * 1 и
6 -> 0110, так как 6 = 2^3 * 0 + 2^2 * 1 + 2^1 * 1 + 2^0 * 0.

0101 + 0110 = ?

S4Circ.gif (4099 bytes)

1011 -> 2^3 * 1 + 2^2 * 0 * 2^1 * 1 + 2^0 * 1 = 11

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

6. Программная модель многоразрядного двоичного сумматора

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

program TstSm4;
const m = 4;   {Количествово разрядов сумматора}
type TNumber = array[0..m-1] of Boolean;

var A,B,S: TNumber;
    Co: Boolean;

procedure WrNumber(A: TNumber);
var i: Integer;
begin for i:=m-1 downto 0 do Write(Ord(A[i]):2) end;

procedure RdNumber(var A: TNumber);
var i,r: Integer;
begin
for i:=m-1 downto 0 do
   begin Read(r); A[i]:=r=1 end
end;

procedure S1(A,B,Ci: Boolean; var S,Co: Boolean);
begin
Co := A and B  or  A and Ci  or  B and Ci;
S :=     A and     B and     Ci  or
         A and not B and not Ci  or
     not A and     B and not Ci  or
     not A and not B and     Ci;
end; {S1}

procedure Sm(A,B: TNumber; Ci: Boolean; var S: TNumber; var Co: Boolean);
var i: Integer; p,q: Boolean;
begin
q:=Ci;
for i:=0 to m-1 do
   begin
   S1(A[i],B[i],q,S[i],p);
   q:=p;
   end;
Co:=p;
end; {Sm}

begin
Write('A: '); RdNumber(A);
Write('B: '); RdNumber(B);
Sm(A,B,False,S,Co);
Write('A =   '); WrNumber(A); WriteLn;
Write('B =   '); WrNumber(B); WriteLn;
Write('S = ',Ord(Co):2); WrNumber(S); WriteLn;
end.

Пример выхода программы TstSm:

A: 0 1 0 1
B: 0 1 1 0
A =    0 1 0 1
B =    0 1 1 0
S =  0 1 0 1 1

Подобные программы применяются для логической отладки принципиальных электрических схем логических устройств ЦВМ.


Copyright г Барков Валерий Андреевич, 2000