помогите с алгоритмом, суть в мимнимизации фал(ф-ций алгебры логики), на входе имеются фал из n переменных в базисе и-или-не, пример -
xyz or !xy!z or ... , где ! -инверсия
другая запись -
111 or 010 ...
минимизация производится когда две фал отличаются значением 1 переменной, пример -
xyz or xy!z == xy
111 or 110 == 11
сама задача -
input: список фал, пример-
(010 110 111 000 ...) == !xy!z or xy!z or xyz or !x!y!z ...
и список вспомогательных фал, пример
(011 101 000 001 ...)
обзовём первый список a, второй b
output: список минимизированных a.
смысл в том, чтобы из списка a при помощи b получить минимальный список. ФАЛ могут минимизироваться как внутри a, так и внутри b, и, конечно, между a и b.
также пусть есть ф-ция, минимизирующая две фал (join_bb fal-1 fal-2)
пример работы-
берём первую фал из a: 010
берём первую фал из b: 011
применяем (join_bb 010 011) --> 01~, "~" значит, что эта перменная сократилась, т.е. 01~ == !xy
если невозможно минимизировать, возвращаем false
с тем что нужно замечательно справляется метод карт Карно, но это больше графический метод и реализовывать его полностью на компе мне кажется плохой идеей. http://ru.wikipedia.org/wiki/Карта_Карно
вроде всё, если у кого-то есть желание помочь буду признателен, сам уже пару дней ломаю голову, пробовал разные пути - от попытки поиска подходящих подмножеств, до попытки полного перебора всех вариантов, но на данный момент и алгоритма нет и здравых идей тоже :)