Алгоритмы поиска оптимального решения имеют экспоненциальную сложность, поэтому обычно доступные инструменты ищут хорошую реализацию, а не оптимальную реализацию.Я не уверен, насколько строги ваши требования или насколько велики ваши функции.
Один алгоритм оптимизации логики - Quine-McCluskey .Существует реализация Python .Однако это относится только к одному выходному случаю.
$ ./qm.py -o 1,2,3
1X X1
$ ./qm.py -o 1,2
10 01
$ ./qm.py -o 0,15
1111 0000
$ ./qm.py -o 0,8,15
1111 X000
Для нескольких выходов простейшая стратегия - реализовать каждый отдельно.Между ними могут быть дублированные термины, которые можно легко разделить;структурировать логику для максимизации общего доступа сложнее.