【发布时间】: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