如何解决匹配两个嵌套的逻辑AND OR表达式树对象
我需要将给定的逻辑表达式与Java中的另一个逻辑表达式进行比较,以识别两者是否相同。
例如,将表达式视为((a&b)&(c|d)&(e&f))
,将其他表达式视为((a&e)&(c|d)&(b&f))
,它们都是等效的。考虑(a&(f&(b&e))&(c|d))
:这也是等效的。此外,此表达式可以嵌套。我曾想将其转换为前缀表示法,但找不到正确的方法。
表达式是一个递归类对象,其表达式类型为AND / OR,并且是其子表达式的数组
例如对于上述第一个表达式:
{
type: AND,expressions: [{
type: AND,expressions: [{
type: SIMPLE,expression: [a] <-- this Could also be nested if type would have been logical
},{
type: SIMPLE,expression: [b]
}]
},{
type: OR,expression: [c]
},expression: [d]
}]
},{
type: AND,expression: [e]
},expression: [f]
}]
}]
}
有什么方法可以简化表达式并进行比较?
解决方法
您可以使用“ boolean.py”模块执行此操作。如果您想尝试一下,那就有些窍门了。您需要通过“ pip install boolean.py”和“ pip install boolean”进行安装。它们是两个不同的软件包,您需要使用'.py'版本。
在这里查看您的示例以及我也添加的失败案例:
import boolean
algebra = boolean.BooleanAlgebra()
expr1 = algebra.parse("((a&b)&(c|d)&(e&f))").simplify()
expr2 = algebra.parse("((a&e)&(c|d)&(b&f))").simplify()
expr3 = algebra.parse("(a&(f&(b&e))&(c|d))").simplify()
print(expr1 == expr2)
print(expr1 == expr3)
expr4 = algebra.parse("(a&(f&(b&e))&(c|d)&(x|y))").simplify()
expr5 = algebra.parse("(a&(f&(b&e))&(c|y)&(x|d))").simplify()
print(expr4 == expr5)
结果:
True
True
False
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。