Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб1.doc
Скачиваний:
1
Добавлен:
16.04.2019
Размер:
579.07 Кб
Скачать

1. Постановка задачи

Используя язык высокого уровня Pascal, минимизируем функцию методом методом Квайна для трёх переменных.

2. Краткие теоретические сведения

Этот метод применим к функции, записанной в СДНФ. Метод минимизации функции проводится поэтапно.

1 этап. Нахождение первичных простых импликант.

Все конъюнкции СДНФ данной функции сравнивают между собой попарно, применяя закон склеивания . Удобно предварительно члены функции занумеровать, и поместить в таблицу. Результаты склеивания записать во 2-й столбец, указывая в скобках номера склеенных членов, а склеенные члены 1-го столбца отметить звездочкой (*). Ранг полученных конъюнкций на единицу ниже, т.е. они содержат на один знак меньше. Эти конъюнкции нумеруются, затем операцию повторяют, записывая результат в 3-й столбец и т.д.

Заканчивают эту процедуру когда вновь полученные конъюнкции уже не склеиваются между собой. Все неотмеченные знаком * конъюнкции являются первичными (простыми) импликантами. Все члены, отмеченные знаком *, будут поглощены простыми импликантами на основании операции поглощения . Для удобства простые импликанты в таблице обводятся рамочкой.

Дизъюнкция всех простых импликант дает сокращенную ДНФ данной функции. Далее необходимо перейти к тупиковой ДНФ.

2 этап. Расстановка меток.

Составляется таблица, число строк которой равно числу найденных простых импликант, а число столбцов – числу членов СДНФ данной функции. В 1-й столбец записываются первичные импликанты, в 1-ю строку члены функции. Если в член СДНФ входит первичная импликанта, то на пересечении их ставится метка .

Члены

Результаты 1-го

склеивания

Результаты 2-го

склеивания

1.

*

(1, 4)

(3, 9)

2.

*

(1, 6)

(4, 6)

3.

*

* (2, 3)

4.

*

* (2, 7)

5.

*

(3, 4)

6.

*

* (3, 8)

7.

*

(5, 6)

8.

*

(5, 8)

9.

* (7, 8)

У первичных импликант 3-го порядка метки удобно проставить по номерам склеенных членов 1-го столбца, приписанным у импликант рядом (в скобках), а у первичных импликант 2-го порядка по номерам членов 1-го столбца. Число меток в строке зависит от числа исключенных букв в импликанте. Для исключенных букв число меток будет .

Рассмотрим 2-й этап на примере 6. Составим таблицу.

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

v

v

v

v

v

v

v

v

v

v

v

v

v

v


Член получился при склеивании членов 3 и 9, 2-го столбца, а те в свою очередь из членов 2, 3 и 7, 8 1-го столбца. Так, первичная импликанта соответствует членам 2, 3, 7, 8 данной функции. Итак, таблица меток построена.

3 этап. Нахождение существенных импликант.

Если в каком-либо столбце составленной таблицы меток имеется только одна метка, то первичная импликанта, стоящая в соответствующей строке, является существенной. Она не может быть исключена из минимальной формы функции, т.к. без нее не может быть получено покрытие всего множества импликант данной функции. Из таблицы меток исключаются строки и столбцы, на пересечении которых стоит эта единственная метка.

В таблице меток столбцами с единственной меткой являются столбцы (2), (7). Соответствующая импликанта является существенной. Метку обводят кружочком, существенные импликанты – рамочкой, а столбцы с единственной меткой вычеркивают из таблицы. По закону поглощения меньшее количество меток в столбце может исключить большее. Так (2) и (7) столбцы входят соответственно в (3) и в (8), поэтому исключаем (3) и (8) столбцы из таблицы меток. 3-й этап закончен.

4 этап. Вычеркивание лишних столбцов.

Если в таблице после 3-го этапа два одинаковых столбца (в которых метки стоят в одинаковых строках), то один из них вычеркивается, т.к. покрытие оставшегося столбца будет осуществлять покрытие выброшенной исходной импликанты. В рассматриваемом примере таких столбцов нет.

5 этап. Вычеркивание лишних строк.

Если в таблице после 4-го этапа появились строки, в которых нет ни одной метки, то их вычеркивают, т.е. первичные импликанты, соответствующие им, исключаются из минимальной формы функции, т.к. они не покрывают оставшихся исходных импликант. В рассмотренном примере таких строк нет.

6 этап. Выбор минимального покрытия.

(1)

(4)

(5)

(6)

v

v

v

v

v

v

v

v

Исследуем таблицу, полученную после всех предыдущих этапов (см. 3-й этап). Выбирается такая совокупность первичных импликант, которая бы имела метки во всех столбцах. Предпочтение отдается варианту покрытия с минимальным числом букв в первичных импликантах, образующих покрытие. В данном примере все оставшиеся первичные импликанты содержат одинаковое число букв. Выберем покрытие из импликант и , т.к. они покрывают все 4 оставшиеся исходные импликанты. Они и будут существенными импликантами.

Итак, из оставшихся существенных импликант записываем тупиковую форму данной функции:

.

Она должна быть неизбыточной. В данном примере – это и есть минимальная форма функции.

Замечание 1-1. В методе Квайна есть одно существенное неудобство – необходимость полного попарного сравнения на этапе нахождения первичных импликант. С ростом числа аргументов функции и определяющих ее членов СДНФ растет число этих сравнений. Этот рост характеризуется факториальной функцией. Поэтому применение метода Квайна становится затруднительным.

Замечание 1-2. По методу Квайна получаются тупиковые формы. Их может быть несколько. Среди них и надо искать минимальные формы.

3. Алгоритм (входные данные, выходные данные)

С клавиатуры вводятся значения функции.

Присваиваются значения функции.

Производим склеивание.

Записываем результат.

4. Анализ результатов

Результаты получились верные. Правильность результатов проверена другими методами.

5. Вывод

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

6. Приложение (листинг программы)

uses crt;

const n1=8;

n2=12;

n3=36;

var a : array[1..n1] of integer;

b : array[1..n2] of integer;

c : array[1..n3] of integer;

i,k1,k2,k3:integer;

begin

clrscr;

writeln('Metod Kvaina dl9 3-x peremennix');

writeln;

i:=1;

writeln('Vvedite rezultat funkcii not(x1)*not(x2)*not(x3)=');

readln(a[i]);

inc(i);

writeln('Vvedite rezultat funkcii not(x1)*not(x2)*(x3)=');

readln(a[i]);

inc(i);

writeln('Vvedite rezultat funkcii not(x1)*(x2)*not(x3)=');

readln(a[i]);

inc(i);

writeln('Vvedite rezultat funkcii not(x1)*(x2)*(x3)=');

readln(a[i]);

inc(i);

writeln('Vvedite rezultat funkcii (x1)*not(x2)*not(x3)=');

readln(a[i]);

inc(i);

writeln('Vvedite rezultat funkcii (x1)*not(x2)*(x3)=');

readln(a[i]);

inc(i);

writeln('Vvedite rezultat funkcii (x1)*(x2)*not(x3)=');

readln(a[i]);

inc(i);

writeln('Vvedite rezultat funkcii (x1)*(x2)*(x3)=');

readln(a[i]);

{--------------------------------}

for i:=1 to n1 do

b[i]:=0;

i:=1;

if (a[1]=1) and (a[2]=1) then

b[i]:=1;

inc(i);

if (a[1]=1) and (a[3]=1) then

b[i]:=1;

inc(i);

if (a[1]=1) and (a[5]=1) then

b[i]:=1;

inc(i);

if (a[2]=1) and (a[4]=1) then

b[i]:=1;

inc(i);

if (a[2]=1) and (a[6]=1) then

b[i]:=1;

inc(i);

if (a[3]=1) and (a[4]=1) then

b[i]:=1;

inc(i);

if (a[3]=1) and (a[7]=1) then

b[i]:=1;

inc(i);

if (a[4]=1) and (a[8]=1) then

b[i]:=1;

inc(i);

if (a[5]=1) and (a[6]=1) then

b[i]:=1;

inc(i);

if (a[5]=1) and (a[7]=1) then

b[i]:=1;

inc(i);

if (a[6]=1) and (a[8]=1) then

b[i]:=1;

inc(i);

if (a[7]=1) and (a[8]=1) then

b[i]:=1;

{--------------------------------}

for i:=1 to n3 do

c[i]:=0;

i:=1;

if (b[1]=1) and (b[6]=1) then

c[i]:=1;

inc(i);

if (b[1]=1) and (b[9]=1) then

c[i]:=1;

inc(i);

if (b[2]=1) and (b[4]=1) then

c[i]:=1;

inc(i);

if (b[2]=1) and (b[10]=1) then

c[i]:=1;

inc(i);

if (b[3]=1) and (b[5]=1) then

c[i]:=1;

inc(i);

if (b[3]=1) and (b[7]=1) then

c[i]:=1;

inc(i);

if (b[4]=1) and (b[11]=1) then

c[i]:=1;

inc(i);

if (b[5]=1) and (b[8]=1) then

c[i]:=1;

inc(i);

if (b[6]=1) and (b[12]=1) then

c[i]:=1;

inc(i);

if (b[6]=1) and (b[8]=1) then

c[i]:=1;

inc(i);

if (b[7]=1) and (b[8]=1) then

c[i]:=1;

inc(i);

if (b[9]=1) and (b[12]=1) then

c[i]:=1;

inc(i);

if (b[10]=1) and (b[11]=1) then

c[i]:=1;

{--------------------------------}

writeln('Rezultat:');

i:=1;

if a[i]=1 then

write('not(x1)*not(x2)*not(x3) v ');

inc(i);

if a[i]=1 then

write('not(x1)*not(x2)*(x3) v ');

inc(i);

if a[i]=1 then

write('not(x1)*(x2)*not(x3) v ');

inc(i);

writeln;

if a[i]=1 then

write('not(x1)*(x2)*(x3) v ');

inc(i);

if a[i]=1 then

write('(x1)*not(x2)*not(x3) v ');

inc(i);

if a[i]=1 then

write('(x1)*not(x2)*(x3) v ');

inc(i);

if a[i]=1 then

write('(x1)*(x2)*not(x3) v ');

inc(i);

if a[i]=1 then

write('(x1)*(x2)*(x3)');

write(' = ');

{--------------------------------}

i:=0;

if (c[1]=1) or (c[3]=1) then

begin

write('NOT(x1)');

inc(i);

end;

if (c[2]=1) or (c[5]=1) then

begin

if i=1 then

write(' v ');

if i=0 then

inc(i);

write('NOT(x2)');

end;

if (c[4]=1) or (c[6]=1) then

begin

if i=1 then

write(' v ');

if i=0 then

inc(i);

write('NOT(x3)');

end;

if (c[12]=1) or (c[11]=1) then

begin

if i=1 then

write(' v ');

if i=0 then

inc(i);

write('x1');

end;

if (c[9]=1) or (c[10]=1) then

begin

if i=1 then

write(' v ');

if i=0 then

inc(i);

write('x2');

end;

if (c[7]=1) or (c[8]=1) then

begin

if i=1 then

write(' v ');

write('x3');

end;

{--------------------------------}

i:=0; k1:=0; k2:=0; k3:=0;

if ((c[1]=1) or (c[3]=1)) and ((c[12]=1) or (c[11]=1)) then

begin

write(' = 1');

inc(i);

inc(k1);

end;

if ((c[2]=1) or (c[5]=1)) and ((c[9]=1) or (c[10]=1)) then

begin

if i=1 then

write(' v ');

if i=0 then

begin

write(' = ');

inc(i);

end;

inc(k2);

write('1');

end;

if ((c[4]=1) or (c[6]=1)) and ((c[7]=1) or (c[8]=1)) then

begin

if i=1 then

write(' v ');

if i=0 then

write(' = ');

write('1');

inc(k3);

end;

{--------------------------------}

if ((k1=1) and (k1=k2)) or ((k1=1) and (k1=k3)) or ((k2=1) and (k2=k3)) then

write(' = 1');

readkey;

end.

Метод Квайна-Мак-Класки

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]