Упрощение логических выражений
От: DSblizzard Россия  
Дата: 08.11.07 07:23
Оценка:
Требуется привести к с.д.н.ф. произвольное логическое выражение. Допустим, такое:
a | c & a => !!b <=> b & a | !b <=> c
( что эквивалентно (((a | (c & a)) => !!b) <=> c) & (((b & a) | !b) <=> c) )
Столкнулся с 2-мя проблемами: во-первых, некоторые выражения упрощаются
( a & b | a & !b равносильно a ),
другие, хоть и очень похожие — нет
( a & b | c & a & !b),
т. е. нужен алгоритм распознавания. Во-вторых, формула может быть очень длинной и неплохо было бы иметь алгоритм побыстрее. Как выгоднее хранить конъюнкты — в алфавитном или лексикографическом порядке?
Посоветуйте какой-нибудь источник на эту тему. Просто учебник логики не предлагайте — алгоритмическая сторона там не рассматривается.
Программировать сложно. Но не программировать еще сложнее.
Re: Упрощение логических выражений
От: Mab Россия http://shade.msu.ru/~mab
Дата: 08.11.07 08:48
Оценка: 1 (1)
Здравствуйте, DSblizzard, Вы писали:

DS>Требуется привести к с.д.н.ф. произвольное логическое выражение.

С.д.н.ф. определена однозначно, для ее вычисления нужно подставить все 2^n комбинаций значений в функцию.

DS>Столкнулся с 2-мя проблемами: во-первых, некоторые выражения упрощаются

DS>( a & b | a & !b равносильно a ),
DS>другие, хоть и очень похожие — нет
DS>( a & b | c & a & !b),
После упрощения будут уже не с.д.н.ф., так что не ясно, к чему это.

DS>т. е. нужен алгоритм распознавания. Во-вторых, формула может быть очень длинной и неплохо было бы иметь алгоритм побыстрее. Как выгоднее хранить конъюнкты — в алфавитном или лексикографическом порядке?

В худшем случае без разницы. Например, для функции "сумма по модулю два всех переменных" любая д.н.ф. будет экспоненциального по n размера.
Re: Упрощение логических выражений
От: Кодт Россия  
Дата: 08.11.07 14:03
Оценка:
Здравствуйте, DSblizzard, Вы писали:

DS>Требуется привести к с.д.н.ф. произвольное логическое выражение. Допустим, такое:


Приведение булевой функции к СДНФ — это не упрощение, а усложнение — фактически, это получается таблица истинности.
Например, f(x,y,z,t)=True в СДНФ состоит из 16 дизъюнктов.

А вот упрощение, — если ничего не путаю, — это NP-полная задача "SAT"
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re: Упрощение логических выражений
От: Leonidze  
Дата: 08.11.07 16:12
Оценка: 2 (1)
Здравствуйте, DSblizzard, Вы писали:

DS>Требуется привести к с.д.н.ф. произвольное логическое выражение. Допустим, такое:

DS>a | c & a => !!b <=> b & a | !b <=> c
DS>( что эквивалентно (((a | (c & a)) => !!b) <=> c) & (((b & a) | !b) <=> c) )
DS>Столкнулся с 2-мя проблемами: во-первых, некоторые выражения упрощаются
DS>( a & b | a & !b равносильно a ),
DS>другие, хоть и очень похожие — нет
DS>( a & b | c & a & !b),
DS>т. е. нужен алгоритм распознавания. Во-вторых, формула может быть очень длинной и неплохо было бы иметь алгоритм побыстрее. Как выгоднее хранить конъюнкты — в алфавитном или лексикографическом порядке?
DS>Посоветуйте какой-нибудь источник на эту тему. Просто учебник логики не предлагайте — алгоритмическая сторона там не рассматривается.

в институте реализовывал эти два для максимум 16 переменных. относительно несложно, относительно быстро:
http://www.dvgups.ru/METDOC/GDTRAN/YAT/AT/TOAVTOM/A/21.htm
http://www.dvgups.ru/METDOC/GDTRAN/YAT/AT/TOAVTOM/A/22.htm

если переменных больше существуют неплохие эвристические методы позволяющие добиться минимизации формул, правда не всегда дающие минимальные результаты (помню, читал монографию на тему), к сожалению не помню название — давно было. Каталог библиотеки в помощь

а вообще в гугле по простым методам информации более чем достаточно:
http://www.google.ru/search?num=50&amp;complete=1&amp;hl=ru&amp;newwindow=1&amp;q=%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F+%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D1%85+%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B9&amp;btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&amp;lr=
Re[2]: Упрощение логических выражений
От: DSblizzard Россия  
Дата: 09.11.07 00:29
Оценка:
Здравствуйте, Mab, Вы писали:

DS>>Столкнулся с 2-мя проблемами: во-первых, некоторые выражения упрощаются

DS>>( a & b | a & !b равносильно a ),
DS>>другие, хоть и очень похожие — нет
DS>>( a & b | c & a & !b),
Mab>После упрощения будут уже не с.д.н.ф., так что не ясно, к чему это.

В первом случае — просто a, т.е. с.д.н.ф., во втором случае — дальше не упрощается, я так и написал.
Программировать сложно. Но не программировать еще сложнее.
Re[2]: Упрощение логических выражений
От: DSblizzard Россия  
Дата: 09.11.07 00:35
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, DSblizzard, Вы писали:


DS>>Требуется привести к с.д.н.ф. произвольное логическое выражение. Допустим, такое:


К>Приведение булевой функции к СДНФ — это не упрощение, а усложнение

Смотря для кого и в каких ситуациях. В логических языках и алгоритме резолюции обычно используются именно нормальные формы.
К>А вот упрощение, — если ничего не путаю, — это NP-полная задача "SAT"
SAT — это выполнимость, т. е. принимает ли данное выражение значение true хоть при одном присваивании значений переменным. К упрощению это не относится.
Программировать сложно. Но не программировать еще сложнее.
Re[2]: Упрощение логических выражений
От: DSblizzard Россия  
Дата: 09.11.07 00:47
Оценка:
Большое спасибо!
Программировать сложно. Но не программировать еще сложнее.
Re[3]: Упрощение логических выражений
От: Mab Россия http://shade.msu.ru/~mab
Дата: 09.11.07 09:44
Оценка: 1 (1)
Здравствуйте, DSblizzard, Вы писали:

DS>В первом случае — просто a, т.е. с.д.н.ф.

Формула "а" не является с.д.н.ф. от переменных a и b.
Re[4]: Упрощение логических выражений
От: DSblizzard Россия  
Дата: 09.11.07 22:41
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, DSblizzard, Вы писали:


Mab>Формула "а" не является с.д.н.ф. от переменных a и b.


Значит, нужно что-то чуть-чуть другое. Спасибо за помощь.
Программировать сложно. Но не программировать еще сложнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.