首页 > 解决方案 > 如何将嵌套函数代码转换为可读的布尔代数?

问题描述

对于我正在编写的这个程序,我正在编写一个需要简化和读取/输出布尔表达式的程序。为此,我需要能够在以下代码之间进行转换:

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

进入

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

反之亦然,所有运算符都作为AND(a,b),OR(a,b)和工作NOT(a),其中 a 和 b 是变量/参数(它们代表我程序中的实际函数)。

我不知道如何处理这个问题,所以如果你能提供任何指导我的东西,我将非常感激。

谢谢你。

标签: pythonparsingtreeboolean-algebra

解决方案


因此,抛开对给定布尔表达式求值的问题,您最终会得到一个特定格式的代码字符串,并且您希望将其重新格式化为不同类型的字符串。从第一种格式更改为第二种格式的一种方法是在 Python 中创建称为“AND”、“OR”和“NOT”的实际函数(这三个词在 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模块中找到诸如“”之类的内容的算法。


推荐阅读