Как я могу преобразовать код вложенной функции в читаемую булеву алгебру? - PullRequest
0 голосов
/ 26 марта 2019

Для этой программы, которую я пишу, я пишу программу, которая должна упрощать и читать / выводить логические выражения. Для этого мне нужно иметь возможность конвертировать между кодами, такими как:

AND(OR(a,b), NOT(OR(c,a)))

в

(A+B).'(C+A)

и наоборот, все операторы работают как AND(a,b), OR(a,b) и NOT(a), где a и b - переменные / параметры (они представляют фактические функции в моей программе).

Я понятия не имею, как к этому подойти, поэтому, если есть что-то, что вы можете мне предложить, я был бы очень благодарен.

Спасибо.

1 Ответ

0 голосов
/ 27 марта 2019

Таким образом, оставляя в стороне проблему оценки заданного логического выражения, вы в конечном итоге получаете строку кода в одном конкретном формате, и вы хотите переформатировать ее в строку другого типа. Один из способов перейти от первого формата ко второму - сделать фактические функции в Python именуемыми «И», «ИЛИ» и «НЕ» (три слова, которые не имеют других специальных значений в Python, когда они написаны на всех шапки как то). Затем определите каждую функцию для вывода на печать второго логического формата. Таким образом, выполнение AND("x","y"), например, возвращает трехсимвольную строку "x.y":

def AND(a,b):
    return "(%s.%s)" % (a, b)

def OR(a,b):
    return "(%s+%s)" % (a, b)

def NOT(a):
    return "'(%s)" % a

a, b, c = "a", "b", "c"
myfirstbool = "AND(OR(a,b), NOT(OR(c,a)))"
mynewbool = eval(myfirstbool)  # Take the string, and treat it as Python code
print(mynewbool)  # output:  ((a+b).'((c+a)))

Это может дать вам несколько лишних скобок, но окончательное выражение все еще допустимо.

Пойти другим путем немного сложнее, потому что вы должны посчитать вложенные скобки, чтобы все было правильно. Возможно, вы захотите посмотреть алгоритмы о том, как разбирать вложенные скобки в Python, как находить такие вещи, как "*+*" в регулярных выражениях или Sympy module.

...