Как создать логическое выражение PyEDA, используя строку, содержащую логическое выражение?
Я получаю логическое выражение в виде ( (A & B) | (C & ~D) )
из интерфейса. Мне нужно преобразовать это в логическое выражение, которое может решить PyEDA. Чтобы написать логическое выражение в PyEDA, нужно сделать два шага.
- Создайте логические переменные A,B,C,D, используя
A,B,C,D = map(exprvar, "abcd") - This becomes a problem when number of boolean variables are dynamic
илиA = exprvars("a", 4) - solves the dynamic variable issue but need to convert letters in the equation to A[0],A[1]...
. - Запишите выражение как
( (A & B) | (C & ~D) )
.
Был опробован следующий подход. boolean_exp представляет строку логического выражения, а num_variables представляет количество переменных в строке.
def parse_boolean_expression(boolean_exp,num_variables):
count = 0
boolean_exp_list = list(boolean_exp)
for index,char in enumerate(boolean_exp_list):
if char.isalpha():
boolean_exp_list[index] = "Z[{}]".format(count)
count += 1
final_bool_exp = "".join(boolean_exp_list)
Z = exprvars("z", num_variables)
expression = final_bool_exp
Этот подход не работает, потому что созданное выражение и переменные имеют строковый тип, а правильные типы должны быть <class 'pyeda.boolalg.expr.OrOp'>
для выражения и <class 'pyeda.boolalg.expr.variables'>
для переменных.
В интерактивном режиме мы можем легко выполнить описанные выше шаги, но как мы можем построить это выражение в режиме сценария, используя строку логического выражения с динамическим числом переменных, отправленных из внешнего интерфейса?
1 ответ
pyEDA имеет
expr()
функция, преобразующая текст в выражение. Вот как это работает на вашем примере.
>>> f = expr('( (A & B) | (C & ~D) )')
>>> f
Or(And(C, ~D), And(A, B))
>>> type(f)
<class 'pyeda.boolalg.expr.OrOp'>
Вот ссылка на дополнительную информацию.
текст в выражение