微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

匹配两个嵌套的逻辑AND OR表达式树对象

如何解决匹配两个嵌套的逻辑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 举报,一经查实,本站将立刻删除。