Как определить фиктивный предикат / заполнитель в 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(бар (_)),
    %....

Это удалит все bars из базы данных, и он объявит bar/1 как dynamic,

Другие вопросы по тегам