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

2. Цель и порядок работы

Цель работы - освоить методы минимизации логических функций: метод неопределенных коэффициентов, метод Квайна и метод Квайна - Мак-Класки.

Работу следует выполнять в таком порядке:

  • изучить описание работы;

  • согласно своему варианту задания, решить заданные примеры без применения ЭВМ

  • разработать алгоритмы решения отдельных задач и оформить в виде процедур

  • разработать и отладить программу в соответствии с заданием;

  • решить задачу с помощью программы и записать результат для одного из случаев генерации.

  • оформить отчет.

3.Задания

3.1 По своему варианту получить из заданной совершенной дизъюнктивной нормальной формы от трех аргументов без использования ЭВМ - минимальную следующими методами: метод неопределенных коэффициентов, метод Квайна и метод Квайна - Мак-Класки.

  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;

Соседние файлы в папке дискретка