SATCHMO 定理证明器是最早使用模型生成的系统之一,即自下而上的证明过程。该证明器由一个小型的 Prolog 程序给出,该程序实现了一个表格证明过程。一个限制是,它需要范围受限公式。
一阶子句
称为 *范围受限*,如果出现在头部
中的每个变量也出现在主体
中。
- 将子句转换为范围受限形式

- 在 Prolog 数据库中断言范围受限子句和 dom 子句。
- 调用 satisfiable
kill satisfiable :- assume(X) :- asserta(X).
(Head <- Body) assume(X) :-
Body, not Head, !, retract(X), !, fail.
component(HLit, Head), component(E, (E ; _)).
assume(HLit), component(E, (_ ; R)) :-
not false, !, component(E, R).
satisfiable. component(E, E).
satisfiable.
通过级别饱和修改实现一阶完备性。该证明过程在地面情况下实现了超表格。
所有开放分支仅包含正文字。以以下子句集为例 
一个 *文字树* 是一个对
,由一个有限的、有序的树
和一个标记函数
组成,该函数将文字分配给
的每个非根节点。
在一个有序树
中,节点
的 后继序列 是所有直接前驱为
的节点的序列,按照
给出的顺序排列。
一组子句
的 (子句)真值表
是一个文字树
,其中,对于
中的每个后继序列
,分别标记为文字
,都存在一个替换
和一个子句
,使得对于每个
都有
。
称为 真值表子句,真值表子句的元素称为 真值表文字。
A branch of a tableau
is a sequence
(
) of nodes in
such that
is the root of
,
is the immediate predecessor of
for
, and
is a leaf of
. We say branch
is a prefix of branch
, written as
or
, iff
for some nodes
,
. The branch literals of branch
are the set
. We find it convenient to use a branch in place where a literal set is required, and mean its branch literals. For instance, we will write expressions like
instead of
.
为了记住一个分支包含矛盾这一事实,我们允许将一个分支标记为 开放 或 封闭。如果真值表中的每个分支都是封闭的,那么该真值表是 封闭 的,否则它是 开放 的。
选择函数是一个全函数
,它将一个开放的 tableau 映射到它的一个开放分支。如果
,我们也说
被选择在
中由
。
请注意,分支始终是有限的,因为 tableau 是有限的。幸运的是,对使用哪种选择函数没有限制。例如,可以使用一个始终选择“最左侧”分支的选择函数。
定义 33 (超 Tableau - 基本情况)
[编辑 | 编辑源代码]
设
是一个有限的子句集,而
是一个选择函数。对于
的超 Tableau 如下所示递归定义
初始化步骤:一个单节点文字树是
的超 Tableau。它的单个分支标记为“打开”。
超扩展步骤:如果
是
的一个开放超 Tableau,
(即
被选择在
中由
)具有开放的叶节点
,并且
是
中的一个子句(
,
),在此上下文中称为扩展子句,并且
- 使得
(称为 *超条件*)。
那么文字树
是
的超表格,其中
是通过将
个子节点
附加到
上,并分别用以下标签标记:

并将每个新的分支
标记为“打开”,并标记每个新的分支
标记为“关闭”。
子句集
显然有两个不同的模型:
和
。在集合包含下,这些模型可以进行比较,在某些任务中,计算最小模型(或一般来说是 *一个* 最小模型)是合适的。例如,以下情况就是如此:
- 知识表示、循环定义
- 默认否定的基础(GCWA)
- 应用:演绎数据库更新、诊断
基本上有两种不同的方法来计算最小模型。
给定一组地子句
,这些方法应用一个模型生成过程,例如超表格,它能够生成所有模型。
引理 1: 对于每个最小模型
存在一个分支,其文字为
。
假设
是来自
的子句头部出现的原子集,那么以下引理成立。
引理 2:
是
的最小模型当且仅当 
这提供了一种通用方法:生成模型候选者,并使用引理 2 进行测试。
在我们上面的例子中不是最小模型,因为
当且仅当
不可满足,但事实并非如此,因此
不对应于最小模型,因此该分支被关闭。
是最小的,因为
当且仅当
不可满足。这是正确的,因此
是最小的,该分支保持打开状态。
特性: 健壮性(根据引理 2) 完备性(根据引理 1),空间效率。
例如,我们有集合 
引理: 使用补码分割时,最左边的开放分支是
的一个最小模型。
通用方法: 重复:生成最小模型
,将
添加到
。 属性: 由于引理的健全性,完整性与之前相同,可能有指数级的新子句
。