【问题标题】:Match two nested logical AND OR expression tree objects匹配两个嵌套的逻辑 AND OR 表达式树对象
【发布时间】:2023-04-10 19:53:02
【问题描述】:

我需要将给定的逻辑表达式与 java 中的另一个进行比较,以确定两者是否相同。 例如,考虑一个表达式为((a&b)&(c|d)&(e&f)),而另一个表达式为((a&e)&(c|d)&(b&f)),它们都是等价的。考虑(a&(f&(b&e))&(c|d)):这也是等价的。此外,这个表达式可以嵌套。我想将其转换为前缀符号,但找不到正确的方法。 Expressions 是一个递归类对象,其表达式类型为 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,
        expressions: [{
            type: SIMPLE,
            expression: [c]
        }, {
            type: SIMPLE,
            expression: [d]
        }]
    }, {
        type: AND,
        expressions: [{
            type: SIMPLE,
            expression: [e]
        }, {
            type: SIMPLE,
            expression: [f]
        }]
    }]
}

有什么方法可以简化表达式并进行比较?

【问题讨论】:

  • 您可能希望将表达式转换为 CNF 或 DNF,然后对子句进行排序,然后进行比较。在比较之前,您可能还希望使用许多缩小算法(如标记算法)之一来最小化表达式。如果在算法执行过程中发现反例,终止。这个问题已经在理论计算机科学中得到了广泛的研究,并且论文很容易获得。任何关于逻辑的初学者课程都应该涵盖这一点。看看约束求解。
  • @Polygnome 如果我确实执行了 cnf,那么如何对子句进行排序(这有什么标准吗?)。我没有正确理解,您能为此指出一两篇论文/课程吗?

标签: java logical-operators infix-notation prefix-notation


【解决方案1】:

您可以使用“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

【讨论】:

  • 我需要在 java 中应用它。有什么替代方案吗?
  • 哈!哎呀。对不起。很明显,我没有注意到这一点。对于那个很抱歉。我去看看……
  • 这个库可能会做同样的事情。它还有一个simplify() 方法:github.com/bpodgursky/jbool_expressions
  • 是的@Steve,谢谢,我确实玩过这个库,它适合我的用例。我看到的唯一挑战是将我的 java 对象转换为该库使用的合适的 Expressions/Tree,因为它只接受 Expression。如何将我的 java 类对象转换为此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
相关资源
最近更新 更多