Минимизация ДНФ с помощью покрытий гиперкуба и карт Карно — различия между версиями
Строка 8: | Строка 8: | ||
*В противном случае мы помещаем в вершину закрашенный белый кружок. | *В противном случае мы помещаем в вершину закрашенный белый кружок. | ||
− | Например, для такой ДНФ: < | + | Например, для такой ДНФ: <tex>(X \wedge \neg Y \wedge Z) \vee (X \wedge Y \wedge Z) \vee (\neg X \wedge Y \wedge Z) \vee (\neg X \wedge Y \wedge \neg Z) \vee ( X \wedge Y \wedge \neg Z)</tex> мы получим такой гиперкуб: [[Файл:Гиперкуб.PNG|Гиперкуб, полученый нами.]] |
Далее обработка гиперкуба идёт следующим образом: | Далее обработка гиперкуба идёт следующим образом: | ||
− | *Если в данном гиперкубе есть грань, все вершины на которой закрашены чёрным, то мы можем записать её в качестве конъюнкта, где будет только переменная с неизменяющейся соответствующей ей координатой, например, грань, на которой лежат закрашенные вершины (0,1,1), (0,1,0), (1,1,0) и (1,1,1) мы можем записать как конъюнкт < | + | *Если в данном гиперкубе есть грань, все вершины на которой закрашены чёрным, то мы можем записать её в качестве конъюнкта, где будет только переменная с неизменяющейся соответствующей ей координатой, например, грань, на которой лежат закрашенные вершины (0,1,1), (0,1,0), (1,1,0) и (1,1,1) мы можем записать как конъюнкт <tex>Y</tex>. |
− | *Теперь мы смотрим, остались ли на рёбрах куба закрашенные и не отмеченные нами в ДНФ вершины. Если — да, то рёбра с такими вершинами мы можем записать в качестве конъюнкта, где будут только переменные с неизменяющимися соответствующим им координатами, например, ребро, соединяющее закрашенные вершины (0,1,1) и (1,1,1) мы можем записать как конъюнкт < | + | *Теперь мы смотрим, остались ли на рёбрах куба закрашенные и не отмеченные нами в ДНФ вершины. Если — да, то рёбра с такими вершинами мы можем записать в качестве конъюнкта, где будут только переменные с неизменяющимися соответствующим им координатами, например, ребро, соединяющее закрашенные вершины (0,1,1) и (1,1,1) мы можем записать как конъюнкт <tex>(Y \wedge Z)</tex>. |
− | *И если после такой обработки у нас остались свободные вершины, мы просто переписываем координаты каждой такой вершины в отдельный конъюнкт, равный 1. Например, вершину (1,0,1) мы бы переписали как конъюнкт < | + | *И если после такой обработки у нас остались свободные вершины, мы просто переписываем координаты каждой такой вершины в отдельный конъюнкт, равный 1. Например, вершину (1,0,1) мы бы переписали как конъюнкт <tex>(X \wedge \neg Y \wedge Z)</tex>. |
− | В итоге нашу изначальную ДНФ можно записать как < | + | В итоге нашу изначальную ДНФ можно записать как <tex>(Y) \vee (X \wedge \neg Y \wedge Z)</tex>. |
== Карты Карно == | == Карты Карно == | ||
Строка 25: | Строка 25: | ||
| | | | ||
| | | | ||
− | !< | + | !<tex> w </tex> |
− | !< | + | !<tex> w </tex> |
− | !< | + | !<tex> \neg w</tex> |
− | !< | + | !<tex> \neg w</tex> |
|- | |- | ||
| | | | ||
| | | | ||
− | !< | + | !<tex>z</tex> |
− | !< | + | !<tex> \neg z</tex> |
− | !< | + | !<tex> \neg z</tex> |
− | !< | + | !<tex>z</tex> |
|- | |- | ||
− | !< | + | !<tex>y</tex> |
− | !< | + | !<tex>x</tex> |
| | | | ||
| | | | ||
Строка 44: | Строка 44: | ||
| | | | ||
|- | |- | ||
− | !< | + | !<tex>y</tex> |
− | !< | + | !<tex> \neg x</tex> |
| | | | ||
| | | | ||
Строка 51: | Строка 51: | ||
| | | | ||
|- | |- | ||
− | !< | + | !<tex> \neg y</tex> |
− | !< | + | !<tex> \neg x</tex> |
| | | | ||
| | | | ||
Строка 58: | Строка 58: | ||
| | | | ||
|- | |- | ||
− | !< | + | !<tex> \neg y</tex> |
− | !< | + | !<tex>x</tex> |
| | | | ||
| | | | ||
Строка 68: | Строка 68: | ||
<br> | <br> | ||
<br> | <br> | ||
− | < | + | <tex>(X \wedge Y \wedge Z \wedge W) \vee (X \wedge Y \wedge \neg Z \wedge W) \vee (X \wedge Y \wedge \neg Z \wedge \neg W) \vee (X \wedge Y \wedge Z \wedge \neg W) \vee (\neg X \wedge Y \wedge Z \wedge W) \vee (\neg X \wedge Y \wedge \neg Z \wedge W) \vee (\neg X \wedge Y \wedge \neg Z \wedge \neg W) \vee (\neg X \wedge Y \wedge Z \wedge \neg W) \vee (X \wedge \neg Y \wedge Z \wedge W) \vee (X \wedge \neg Y \wedge \neg Z \wedge W) \vee (\neg X \wedge \neg Y \wedge \neg Z \wedge \neg W)</tex> |
<br> | <br> | ||
<br> | <br> | ||
Строка 77: | Строка 77: | ||
| | | | ||
| | | | ||
− | !< | + | !<tex> w </tex> |
− | !< | + | !<tex> w </tex> |
− | !< | + | !<tex> \neg w</tex> |
− | !< | + | !<tex> \neg w</tex> |
|- | |- | ||
| | | | ||
| | | | ||
− | !< | + | !<tex>z</tex> |
− | !< | + | !<tex> \neg z</tex> |
− | !< | + | !<tex> \neg z</tex> |
− | !< | + | !<tex>z</tex> |
|- | |- | ||
− | !< | + | !<tex>y</tex> |
− | !< | + | !<tex>x</tex> |
|1 | |1 | ||
|1 | |1 | ||
Строка 96: | Строка 96: | ||
|1 | |1 | ||
|- | |- | ||
− | !< | + | !<tex>y</tex> |
− | !< | + | !<tex> \neg x</tex> |
|1 | |1 | ||
|1 | |1 | ||
Строка 103: | Строка 103: | ||
|1 | |1 | ||
|- | |- | ||
− | !< | + | !<tex> \neg y</tex> |
− | !< | + | !<tex> \neg x</tex> |
| | | | ||
| | | | ||
Строка 110: | Строка 110: | ||
| | | | ||
|- | |- | ||
− | !< | + | !<tex> \neg y</tex> |
− | !< | + | !<tex>x</tex> |
|1 | |1 | ||
|1 | |1 | ||
Строка 123: | Строка 123: | ||
| | | | ||
| | | | ||
− | !< | + | !<tex> w </tex> |
− | !< | + | !<tex> w </tex> |
− | !< | + | !<tex> \neg w</tex> |
− | !< | + | !<tex> \neg w</tex> |
|- | |- | ||
| | | | ||
| | | | ||
− | !< | + | !<tex> z </tex> |
− | !< | + | !<tex> \neg z</tex> |
− | !< | + | !<tex> \neg z</tex> |
− | !< | + | !<tex> z </tex> |
|- | |- | ||
− | !< | + | !<tex> y </tex> |
− | !< | + | !<tex> x </tex> |
|style="background:#F4A460"|1 | |style="background:#F4A460"|1 | ||
|style="background:#F4A460"|1 | |style="background:#F4A460"|1 | ||
Строка 142: | Строка 142: | ||
|style="background:#F4A460"|1 | |style="background:#F4A460"|1 | ||
|- | |- | ||
− | !< | + | !<tex> y </tex> |
− | !< | + | !<tex> \neg x</tex> |
|style="background:#F4A460"|1 | |style="background:#F4A460"|1 | ||
|style="background:#F4A460"|1 | |style="background:#F4A460"|1 | ||
Строка 149: | Строка 149: | ||
|style="background:#F4A460"|1 | |style="background:#F4A460"|1 | ||
|- | |- | ||
− | !< | + | !<tex> \neg y</tex> |
− | !< | + | !<tex> \neg x</tex> |
| | | | ||
| | | | ||
Строка 156: | Строка 156: | ||
| | | | ||
|- | |- | ||
− | !< | + | !<tex> \neg y</tex> |
− | !< | + | !<tex> x </tex> |
|style="background:#D2B48C"|1 | |style="background:#D2B48C"|1 | ||
|style="background:#D2B48C"|1 | |style="background:#D2B48C"|1 | ||
Строка 164: | Строка 164: | ||
|} | |} | ||
<br> | <br> | ||
− | *После этого записываем каждый прямоугольник в виде конъюнкта, в котором будут указаны только те переменные, которые одинаковы для всех ячеек этого прямоугольника: < | + | *После этого записываем каждый прямоугольник в виде конъюнкта, в котором будут указаны только те переменные, которые одинаковы для всех ячеек этого прямоугольника: <tex>Y \wedge (X \wedge \neg Y \wedge W) \wedge (\neg X \wedge \neg Y \wedge \neg Z \wedge \neg W)</tex> |
== См. также == | == См. также == | ||
[[Сокращенная и минимальная ДНФ]] | [[Сокращенная и минимальная ДНФ]] |
Версия 02:54, 12 октября 2010
Рассмотрим два способа минимизации дизъюнктивных нормальных форм:
Визуализация гиперкубами
Этот способ работает при количестве переменных не больше трёх (в противном случае нам придётся вводить четвёртое и следующие за ним измерения для представления фигур). Сначала мы рисуем куб в системе отсчёта Oxyz (названия координатных осей должны соответствовать названиям переменных). Затем каждую вершину обрабатываем следующим образом:
- Если у нас конъюнкт, переменные в котором равны соответствующим координатам вершины (пример: вершине с координатами (0,1,1) соответствует конъюнкт , он равен единице при X=0, Y=1 и Z=1), то в эту вершину мы помещаем закрашенный чёрным кружок.
- В противном случае мы помещаем в вершину закрашенный белый кружок.
Далее обработка гиперкуба идёт следующим образом:
- Если в данном гиперкубе есть грань, все вершины на которой закрашены чёрным, то мы можем записать её в качестве конъюнкта, где будет только переменная с неизменяющейся соответствующей ей координатой, например, грань, на которой лежат закрашенные вершины (0,1,1), (0,1,0), (1,1,0) и (1,1,1) мы можем записать как конъюнкт .
- Теперь мы смотрим, остались ли на рёбрах куба закрашенные и не отмеченные нами в ДНФ вершины. Если — да, то рёбра с такими вершинами мы можем записать в качестве конъюнкта, где будут только переменные с неизменяющимися соответствующим им координатами, например, ребро, соединяющее закрашенные вершины (0,1,1) и (1,1,1) мы можем записать как конъюнкт .
- И если после такой обработки у нас остались свободные вершины, мы просто переписываем координаты каждой такой вершины в отдельный конъюнкт, равный 1. Например, вершину (1,0,1) мы бы переписали как конъюнкт .
В итоге нашу изначальную ДНФ можно записать как
.Карты Карно
Этот способ работает при количестве переменных не более 4.
Мы рисуем следующую таблицу n*n, где n — количество переменных:
Теперь для каждого конъюнкта мы помечаем соответствующую ему ячейку таблицы. Например, ДНФ
будет выглядеть на картах Карно так:
1 | 1 | 1 | 1 | ||
1 | 1 | 1 | 1 | ||
1 | |||||
1 | 1 |
- Теперь мы покрываем непересекающимися прямоугольниками (длины сторон которых — степени двойки (1, 2, 4)) с максимальной площадью те ячейки карт Карно, которые содержат в себе единицу до тех пор, пока не покроем все такие ячейки (для карт Карно на примере это выглядело бы так):
1 | 1 | 1 | 1 | ||
1 | 1 | 1 | 1 | ||
1 | |||||
1 | 1 |
- После этого записываем каждый прямоугольник в виде конъюнкта, в котором будут указаны только те переменные, которые одинаковы для всех ячеек этого прямоугольника: