【发布时间】:2012-11-13 11:00:19
【问题描述】:
给定一组 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
我认为我需要以某种方式“规范化”解析树,然后比较它们。任何人都可以概述一种方法或勾勒出架构吗?
【问题讨论】:
-
对不起,这与你的问题无关,但我想知道:你会推荐什么语言来编程形式逻辑?
-
@QuietThud:Prolog 是最常见的逻辑教学语言。在该领域中,我们借用从逻辑编程语言中学习到的逻辑编程“模式”,但将它们实现为工业语言(如 C++)中的库功能。
-
@AndrewTomazos-Fathomling:我觉得使用类似于Unification 的方法可能会解决这个问题,但可能需要一些修补。为了以防万一,想指出来。
-
不,你不需要统一,因为对象
x没有任何结构,它们不会以任何方式使用。
标签: algorithm math logic boolean-logic