program Minimization; { Здесь все просто: функция, переводящая число N из 10 с/с в M-ичную. Причем полученая строка дополняется нулями до _двух_ символов } function fromdec(n,m : longint): string; var s: string; const digit: string[16] = '0123456789ABCDEFQ'; begin s := ''; repeat s := digit[(n mod m) + 1] + s; n := n div m; until n = 0; while length(s) < 2 do s := '0' + s; fromdec := s; end; const s: string = 'A*/B+/A*/C*/D+B*/C*D'; type tmatrix = array[0 .. 3, 0 .. 3] of 0 .. 1; { Тип - матрица для хранения результата } var mx: tmatrix; p, i: integer; mask, sub_s: string; { Функция, определяющая, соответствует ли строка S маске Mask } function matches(s, mask: string): boolean; var i: integer; begin matches := true; for i := 1 to length(s) do begin if (mask[i] = 'X') or (s[i] = mask[i]) then {} else matches := false end; end; { Вывод матрицы - результата на печать } procedure print_mx(const mx: tmatrix); var i, j: integer; begin for i := 0 to 3 do begin for j := 0 to 3 do write(mx[i, j]:3); writeln; end; end; { Процедура заполнения матрицы. в качестве first передается маска для первых двух переменных (AB), second - маска для CD (поскольку строится вот такая карта (AB - по вертикали, CD - по горизонтали): CD 00 01 10 11 AB 00 01 10 11 } procedure fill_mx(var mx: tmatrix; first, second: string); var i, j: integer; begin for i := 0 to 3 do for j := 0 to 3 do { Собственно, заполнение матрицы: если двоичное представление номера строки i подходит под маску first, а представление номера столбца j - под маску second, то на пересечении строки i и столбца j ставится единица } if matches(fromdec(i, 2), first) and matches(fromdec(j, 2), second) then mx[i, j] := 1; end; begin { write ('function: '); readln(s); } writeln('function: ', s); s := s + '+'; { добавляем + в строку для упрощения разбиения ее на произведения } repeat p := pos('+', s); if p > 0 then begin sub_s := copy(s, 1, p-1); { <--- sub_s содержит очередное произведение (конъюнкцию) переменных } { Теперь строим маску, согласно значениям, содержащимся в этой конъюнкции Изначально маска = XXXX, т.е., не зависит от переменных ABCD } mask := ''; for i := 1 to 4 do mask := mask + 'X'; { А теперь пробегаем по строке, и для каждого имени переменной A .. D если имя этой переменной используется без отрицания (предыдущий символ <> '/'), то в маску на нужную позицию ставим 1, если отрицание - то ставим 0 } for i := 1 to length(sub_s) do begin if sub_s[i] in ['A' .. 'D'] then if (i > 1) and (sub_s[i - 1] = '/') then mask[ord(sub_s[i]) - ord('A') + 1] := '0' else mask[ord(sub_s[i]) - ord('A') + 1] := '1'; end; { Все, маска текущей конъюнкции построена, можно заполнять для нее таблицу. Первые 2 символа маски относятся к переменным AB, вторые - к переменным CD, следовательно первые 2 символа передаются как маска first, а вторые - second } fill_mx(mx, copy(mask, 1, 2), copy(mask, 3, 2)); delete(s, 1, p); { удаляем обработанные данные из строки, и продолжаем цикл } end; until p = 0; { Вся строка обработана, печатаем результат } print_mx(mx); readln; end.