逻辑表达式交叉的算法?

时间:2012-11-25 23:48:53

标签: algorithm math logic boolean-logic

给定一组n个元素U和一组m个属性P,其中P的每个元素定义一个从U到布尔的函数。

给定形式的两个复合逻辑表达式(递归定义):

p1 : true iff p1(x) is true
e1 and e2 : means e1 and e2 are both true
e1 or e2 : means e1 and e2 are not both false
not e1 : true iff e1 is false
(e1) : true iff e1

这些逻辑表达式被解析为表达式语句(解析树)。

假设对于任何p1,p2:所有四个集合(p1和p2),(p1而不是p2),(不是p1和p2),(不是p1而不是p2),都是非空的。

我想确定逻辑表达式L1是否是L2的子集。这是针对U中的每个元素x,如果L1(x)为真,则L2(x)为真。

例如:

is_subset(not not p1, p1) is true
is_subset(p1, p2) is false
is_subset(p1 and p2 and p3, (p1 and p2) or p3) is true

我认为我需要以某种方式“解析”解析树,然后比较它们。任何人都可以概述一种方法或草拟架构吗?

3 个答案:

答案 0 :(得分:1)

由于你没有对对象(x)做任何事情,似乎你需要命题逻辑,其中p1pn的真值的所有组合都是可能的。

所以基本上你想在命题逻辑中做定理证明。

您的is_subset(e1,e2)会转换为逻辑运算符e1 implies e2,与not e1 or e2相同。要知道这些是否普遍存在,您可以检查否定是否不满足可满足性检查算法,例如DPLL

这只是一个起点,还有许多其他选项可以证明命题逻辑中的定理。

答案 1 :(得分:0)

您可以将每个公式转换为disjunctive normal form,并查找是否包含另一个中的连接子句的子集。这种方法的复杂性随着所提到的pn数量的指数而增长。

答案 2 :(得分:0)

我认为你的导师基本上希望你实现Quine-McCluskey Algorithm注意,正如另一个答案所暗示的那样,执行时间变得异常快,因为问题是-NH Hard。