Вот минимальный пример использования пакета sldnfdraw
. Сначала создайте программу и запрос, используя синтаксис, указанный в документации библиотеки :
% estamos.pl
:- use_module(library(sldnfdraw)).
:- sldnf.
:- begin_program.
reverse_bits([1], [0]).
reverse_bits([0], [1]).
reverse_bits([H|T], [0|R]) :- H==1, reverse_bits(T, R).
reverse_bits([H|T], [1|R]) :- H==0, reverse_bits(T, R).
:- end_program.
:- begin_query.
reverse_bits(Input,[1,0,0]).
:- end_query.
Затем создайте файл .tex
для соответствующего дерева разрешений:
?- draw_goal('estamos-tree.tex').
Вы можете запустить эту цель из командной строки. Наконец, включите этот файл в .tex
документ
% estamos-tree-draw.tex
\documentclass{article}
\usepackage{epic,eepic}
\usepackage{ecltree}
\begin{document}
\input{estamos-tree}
\end{document}
и скомпилируйте с
$ latex estamos-tree-draw.tex
$ dvipdf estamos-tree-draw.dvi
В вашей исходной папке должен быть файл .pdf
, содержащий дерево разрешения.
Улучшение кода
Для чего бы это ни стоило, я бы предложил написать вашу программу в виде:
reverse_bits([],[]).
reverse_bits([0|T],[1|R]) :- reverse_bits(T,R).
reverse_bits([1|T],[0|R]) :- reverse_bits(T,R).
для простоты и во избежание использования ==
вместо объединения, как false отмечено в комментариях.
Вывод при использовании =
(объединение)
Здесь мы используем =
объединение в тестировании "защитной части" H
.
Вывод при использовании ==
(термин эквивалентность)
При использовании термин эквивалентность ==
мы сделали очень быстро, потому что при первом вызове происходит сбой:
Поскольку единственное предложение, которое соответствует, это reverse_bits([H|T], [1|R]) :- H==0, reverse_bits(T, R).
и в этот момент, H
является переменной fre sh и никоим образом не эквивалентна 0
.