快速审核:
问题:
给定输入目标(例如A AND B,C
),假设我们首先在A AND B
上应用规则AND,然后获得两个新的子目标,第一个是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 *)
答案 0 :(得分:1)
如果你想要最短(最浅)的证明,在这种情况下使用析取介绍并避免连词介绍,那么你可以看看像iterative deepening这样的技巧。例如,您可以按如下方式更改代码:
let rec prove n goal =
if n=0 then failwith "No proof found" else
let rule = get_rule goal in
let sub-goals = apply_rule goal in
let sub-trees = List.map (fun g -> prove (n-1) g) sub-goals in
(goal, rule, sub-trees)
let idfs maxn goal =
let rec aux n =
if n > maxn then None else
try
Some (prove n goal)
with Failure _ -> aux (n+1) in
aux 1
如果你想避免为已经出现的子目标重新做证明,那么你可以使用某种形式的记忆(真正的一种简短的引理推测/应用)。例如,请参阅此question的答案,尤其是第二个答案,因为prove
自然是递归的。
这些建议不涉及您选择应用规则的主题,即get_rule
的编码方式。在实践中,许多选项都可用,您可能希望迭代它们。