快速复审:
- 推理规则=结论+规则+前提
- 证明树 = 结论 + 规则 + 子树
- 后向证明搜索:给定一个输入目标,尝试通过自下而上的方式应用推理规则构建证明树(例如目标是最终结论,应用规则后会生成新的子目标列表现场)
问题:
给定一个输入目标(例如A AND B,C
),假设我们首先在 上应用规则 AND A AND B
,然后得到两个新的子目标,第一个是A,C
,第二个是B,C
。
问题是A
和B
是无用的,这意味着我们可以只使用C
. 但是,我们有两个子目标,那么我们要证明C
两次,所以效率很低。
问题:
例如,我们有A AND B,C AND D,E AND F,G,H AND I
. 在这种情况下,我们只需要 D 和 G 来构建完整的证明树。那么如何选择正确的规则来应用呢?
这是 Ocaml 中的示例代码:
(* conclusion -> tree *)
let rec prove goal = (* the function builds a proof tree from an input goal *)
let rule = get_rule goal in (* get the first rule *)
let sub-goals = apply_rule goal in (* apply a rule *)
let sub-trees = List.map (fun g -> prove g) sub-goals in (* prove sub-goals recursively *)
(goal, rule, sub-trees) (* return proof tree *)