Пролог - Assert в новую базу данных

:-dynamic listofQuestions/2.
myrule:-
    write('P = '), write(Percent), write('-'),write(X),
    ( listofQuestions(Percent,X) -> true ; assert(listofQuestions(Percent,X)) ),

Фрагмент кода, возможно, не требуется, чтобы ответить на мой вопрос.

Я хочу утверждать пустое "listofQuestions" каждый раз, когда я называю свое правило. Это происходит только в том случае, если я закрываю окно пролога и перезапускаю его.

Какие-либо предложения?

1 ответ

Решение

abolish/1 удаляет все предложения данного предиката из базы данных. Следовательно, просто добавьте вызов abolish(PredName/Arity) всякий раз, когда вам нужно удалить информацию об этом предикате. Помните, что после отмены вызова динамического предиката не происходит сбой, а выдается сообщение об ошибке.

12 ?- f(X,Y).
false.

13 ?- assert(f(a,b)).
true.

14 ?- f(X,Y).
X = a,
Y = b.

15 ?- abolish(f/2).
true.

16 ?- f(X,Y).
ERROR: user://2:67:
        toplevel: Undefined procedure: f/2 (DWIM could not correct goal)

В SWI-Прологе abolish работает на статических процедурах, если только флаг пролога iso установлен в true. Если вы намерены удалить только динамические предикаты, вам лучше попробовать retractall, Обратите внимание, что в этом случае удаление приводит не к сообщению об ошибке, а к сбою.

17 ?- [user].
:- dynamic f/2.
|: 
% user://3 compiled 0.00 sec, 264 bytes
true.

18 ?- f(X,Y).
false.

19 ?- assert(f(a,b)).
true.

20 ?- f(X,Y).
X = a,
Y = b.

21 ?- retractall(f(X,Y)).
true.

22 ?- f(X,Y).
false.
Другие вопросы по тегам