Пролог - 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.