Пролог - ASSERT и RETRACT - PullRequest
       29

Пролог - ASSERT и RETRACT

24 голосов
/ 12 марта 2010

Мне было интересно, я знаю, что вы можете использовать assert для добавления фактов или правил или чего-либо еще, если вы объявили предикат -:dynamic, но это позволяет только тем изменениям, которые были внесены, сохранить в этом сеансе только, например если вы закроете окно Prolog, изменения базы данных будут потеряны.

Поэтому мне было интересно, есть ли способ сделать так, чтобы предикаты assert и retract могли вносить постоянные изменения в файл Prolog .pl?

Спасибо

1 Ответ

39 голосов
/ 13 марта 2010

Я могу предложить вам очень простой способ сделать это.

1 ?- assert(a(1)).
true.

2 ?- assert(a(2)).
true.

3 ?- assert(a(3)).
true.

4 ?- a(A).
A = 1 ;
A = 2 ;
A = 3.

5 ?- tell('a_db.txt'), listing(a), told.
true.

Затем закройте сессию, снова откройте.

1 ?- a(A).
ERROR: toplevel: Undefined procedure: a/1 (DWIM could not correct goal)
2 ?- ['a_db.txt'].
% a_db.txt compiled 0.00 sec, 516 bytes
true.

3 ?- a(A).
A = 1 ;
A = 2 ;
A = 3.

4 ?- listing(a).
:- dynamic a/1.

a(1).
a(2).
a(3).

true.
...