
2. Цель и порядок работы
Цель работы - освоить методы минимизации логических функций: метод неопределенных коэффициентов, метод Квайна и метод Квайна - Мак-Класки.
Работу следует выполнять в таком порядке:
изучить описание работы;
согласно своему варианту задания, решить заданные примеры без применения ЭВМ
разработать алгоритмы решения отдельных задач и оформить в виде процедур
разработать и отладить программу в соответствии с заданием;
решить задачу с помощью программы и записать результат для одного из случаев генерации.
оформить отчет.
3.Задания
3.1 По своему варианту получить из заданной совершенной дизъюнктивной нормальной формы от трех аргументов без использования ЭВМ - минимальную следующими методами: метод неопределенных коэффициентов, метод Квайна и метод Квайна - Мак-Класки.
Разработать программу получения МДНФ для заданной функции четырех аргументов методом Квайна - Мак-Класки.
Варианты заданий
№ |
|
|
1 |
V(0,1,2,3,4) |
V(0,2,4,8,11,13,15) |
2 |
V(0,1,2,5) |
V(5,7,13,14,15) |
3 |
V(0,1,4,5) |
V(0,1,2,4,7,8,12,15) |
4 |
V(0,1,2,3,4,7) |
V(3,7,11,12,13,15) |
5 |
V(0,1,2,3,5) |
V(6,7,8,9,14,15) |
6 |
V(0,2,3,4,5) |
V(0,2,4,8,10,11) |
7 |
V(1,2,3,4,5) |
V(2,3,10,11,13,14,15) |
8 |
V(0,1,2,3,4,5) |
V(1,4,8,9,12,14) |
9 |
V(1,2,3,6) |
V(0,8,9,10,11) |
10 |
V(0,1,2,3,6) |
V(1,2,4,7,12,13,15) |
11 |
V(0,1,3,4,6) |
V(0,1,2,4,8,9,13) |
12 |
V(2,3,4,6) |
V(6,7,10,11,15) |
13 |
V(0,2,3,4,6) |
V(3,7,9,11,15) |
14 |
V(1,2,3,4,6) |
V(2,6,7,8,12,14) |
15 |
V(0,1,2,3,4,6) |
V(0,2,5,6,10,11) |
4.Методические указания
Для описания наборов задаваемой функции рекомендуется использовать кольцевые линейные списки. Каждому единичному набору соответствует элемент списка типа string, длина строки определяется числом входных аргументов. Кольцевые списки позволяют производить многократные сравнения и выделять
Структура кольцевого списка
type
Zap=record
Ptr:Pointer;
Info:string[3];
end;
Полученные первичные импликанты и термы исходного уравнения сводятся в таблицу, которую удобно организовать на массиве.
type
mas=array[0..8,0..8] of string;
Для работы с динамическими типами существую типовые процедуры вставки, чтения и сравнения.
Процедура вставки элемента в линейный список
procedure Insert (s:string; var Lst:Pointer);
var P:^Zap;
begin
New(P);
P^.Info:=s;
P^.Ptr:=Lst;
Lst:=P;
end;
Процерура чтения элемента из линейного списка.
procedure Read(var s:string;var Lst:Pointer);
var P:^Zap;
begin
P:=Lst;
Lst:=P^.Ptr;
s:=P^.Info;
end;
Процедура сравнения двух термов и получение первичной имликанты.
procedure findindex(s,s1:string; var K:Pointer);
Var P:^Zap;
begin
read(s,lst1);
read(s1,lst2);
number:=0;
for i:=1 to 3 do
if s[i]=s1[i] then number:=number+1 else j:=i;
if number=2 then
begin
s2:=s1;
s2[j]:='x';
end;
Type Mas=array[1..N;1..N] of string;
Procedure minpokr(Fun:Mas);
var mnstolb,mnstrok,stolb,strok,mn,need,mn1,mn2,mn3 :set of 1..N;
s,s1,s2:string;
i,j,number,m,kol,kolstr,kolstolb,max,min,stolb1,n:byte;
begin
i:=1;
j:=1;
s:=Fun[0,i];
while s<>'' do
begin
s1:=Fun[j,0];
while s1<>'' do
begin
number:=0;
for m:=1 to 4 do
if (s[m]=s1[m])or(s1[m]='x') then number:=number+1;
if number=4 then Fun[j,i]:='****';
j:=j+1;
s1:=Fun[j,0];
end;
j:=1;
i:=i+1;
s:=Fun[0,i];
end;
for i:=1 to 16 do
if i in mnstolb then
for j:=1 to 16 do
begin
s:=Fun[i,j];
if s='****' then mnstrok:=mnstrok+[j];
end;
j:=1;
s:=Fun[0,j];
while s<>'' do
begin
if not(j in mnstrok) then
begin
m:=1;
kol:=0;
while (m<=kolstolb) do
begin
s2:=Fun[m,j];
if s2='****' then
begin
kol:=kol+1;
i:=m;
end;
m:=m+1;
end;{while}
if kol=1 then
begin
mnstolb:=mnstolb+[i];
result:=result+Fun[i,0]+'+';
for m:=1 to kolstr do
begin
s2:=Fun[i,m];
if s2='****' then mnstrok:=mnstrok+[m];
end;
end;{if}
if kol=0 then
begin
mnstolb:=mnstolb+[j];
mnstrok:=mnstrok+[j];
result:=result+Fun[0,j]+'+';
end; {if}
end;{if}
j:=j+1;
s:=Fun[0,j];
end; {while}
need:=[];
kol:=0;
for i:=1 to kolstr do
if not(i in mnstrok) then
begin
need:=need+[i];
kol:=kol+1;
end;
while kol<>0 do
begin
kol:=16;
for i:=1 to kolstr do
begin
number:=0;
if i in need then
begin
for j:=1 to kolstolb do
if not(j in mnstolb) then
if Fun[j,i]='****' then
begin
number:=number+1;
stolb1:=j;
end;
if number<kol then
begin
kol:=number;
max:=stolb1;
end;
end;
end;
if kol=1 then
begin
mnstolb:=mnstolb+[max];
result:=result+Fun[max,0]+'+';
for n:=1 to kolstr do
if n in need then
if Fun[max,n]='****' then mnstrok:=mnstrok+[n];
end;
need:=[];
kol:=0;
for n:=1 to kolstr do
if not(n in mnstrok) then
begin
need:=need+[n];
kol:=kol+1;
end;
min:=16;
for j:=1 to kolstolb do
begin
number:=0;
if not(j in mnstolb) then
begin
for n:=1 to kolstr do
if n in need then
if Fun[j,n]='****' then number:=number+1;
if number<min then
begin
end;
end;
end;
mnstolb:=mnstolb+[m];
need:=[];
for n:=1 to kolstr do
if not(n in mnstrok) then need:=need+[n];
kol:=0;
for n:=1 to kolstr do
if not(n in mnstrok) then kol:=kol+1;
end;
end;