Как определить фиктивный предикат / заполнитель в GNU Prolog
У меня есть файл Prolog со следующей структурой:
% LIBRARY SECTION %
foo(X) :- bar(X);
baz(X).
% USER DATA SECTION %
% e.g. bar(charlie).
Пользовательские данные файла предназначены для расширения пользователем, но по умолчанию ничего не содержат. Однако это вызывает запрос foo(X).
к неудачам, потому что bar/1
а также baz/1
не определены.
Я попытался определить их с помощью значений заполнителей (т.е. bar(none).
) но затем GNU Prolog жалуется на несмежные предикаты, когда пользовательские данные добавляются в конец файла.
Есть ли другой способ определения фиктивной / заполненной версии bar/1
а также baz/1
чтобы foo(X).
не подведет и так что другие строки содержащие bar
а также baz
можно добавить в конец файла?
1 ответ
Если я понимаю вопрос, вы хотите иметь что-то вроде:
ask_bar: - % получить пользовательский ввод assertz(бар (вход)). foo(X):- бар (Х).
Если это действительно проблема, у вас есть два варианта:
Первый: объявить bar/1
в качестве динамического предиката:
:- dynamic(bar/1).
(это директива, вы просто набираете :-
в начале строки.)
Второй: в вашей программе, перед любой ссылкой на bar/1
вызовите предикат retractall/1
, как это:
главный:- retractall(бар (_)), %....
Это удалит все bar
s из базы данных, и он объявит bar/1
как dynamic
,