Быстрый просмотр:
- Правило вывода = заключение + правило + посылки
- Дерево доказательств = заключение + правило + поддеревья
- Обратный поиск доказательств: с учетом входной цели попробуйте построить дерево доказательств, применяя правила вывода снизу вверх (например, цель - это окончательный вывод, после применения правила будет сгенерирован список новых подцелей. на территории)
Проблема:
Учитывая входную цель (например, A AND B,C
), предположим, что мы применяем правило И сначала к 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 *)