Существует ли дерево SLD, если запрос в Прологе недействителен? - PullRequest
0 голосов
/ 10 января 2020

Учитывая следующую программу Prolog:

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).

Что такое дерево SLD для вопроса выше?

reverse_bits(Input, [1, 0, 0]).?

Это недопустимо, поэтому существует ли вообще дерево SLD?

1 Ответ

5 голосов
/ 11 января 2020

Вот минимальный пример использования пакета 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.

SLD tree with unification

Вывод при использовании == (термин эквивалентность)

При использовании термин эквивалентность == мы сделали очень быстро, потому что при первом вызове происходит сбой:

SLD tree with term equivalence

Поскольку единственное предложение, которое соответствует, это reverse_bits([H|T], [1|R]) :- H==0, reverse_bits(T, R). и в этот момент, H является переменной fre sh и никоим образом не эквивалентна 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...