【算法概论】贪心算法:Horn公式

Horn公式,又称霍恩公式。

Horn公式中最基本的对象是取值为true或false的布尔变量。

在Horn公式中,关于变量的知识通过两类子句表达:

① 蕴含式:其左侧为任意肯定变量的并,右侧为一个单独的肯定变量。如:(z /\ w)  → u。

② 纯否定子句:包含任意多个否定文字的或。如:(\bar{u} \vee \bar{v} \vee \bar{y})。

问题描述:

给定某个由以上两类子句构成的集合,我们需要判断是否存在一个一致的解释,也即一组使得所有子句都满足的变量赋值。该解释通常也称为该Horn公式的一个可满足赋值。

❗算法描述❗:

       从所有变量为 false 开始(使得刚开始纯否定子句一定满足), 一个接一个地将其中的部分变量置为 true,置为 true 的前提简单地就是说:“只需且不得不”这样做以使得某个蕴含式满足;而一旦所有的蕴含式得到了满足,再回头检查是否所有否定子句仍然满足。

       那具体如何实现呢:

       首先读取所有的蕴含式,利用它们构造一个有向图。

       式子的右边的字母,是箭头最终的指向,该箭头的从式子左边的字母分别出发,一同指向一个结点(式子左边字母的个数),由该数字结点指向结果。

       例如,(w /\ y /\ z ) → x,(x /\ z) → w,x → y,→ y,(x /\ y) → w,可以被表示为:

【算法概论】贪心算法:Horn公式_第1张图片

       然后将所有的变量值设为false,对有向图进行DFS。从结点0出发,将结点0指向的字母结点设为true,同时将其指向的数字节点的值全部减1,如果有一个数字节点的值减1后为0,则沿该数字节点继续DFS,否则跳出。接着检查当前字母的值是否满足所有纯否定句,若满足,说明存在该Horn公式的一个可满足赋值。

你可能感兴趣的:(数据结构与算法)