LINUX.ORG.RU

[prolog] сохранение/загрузка правил


0

1

Осваиваю swi-prolog. Нашел, что можно динамически сохранять в базу правила с помощью assertz. Но не могу понять, ка потом эту базу сохранить в файл, а в следующий раз его загрузить. В идеале должно быть так: при выходе из программы сохраняем все в файл, при запуске - загружаем.

★★★★★

Что, никто прологом не пользовался серьезно?

vurdalak ★★★★★ ()
Ответ на: комментарий от vurdalak

Да, я тоже думаю это из-за ника. Ведь Prolog такой популярный ЯП.

kermzyxer ()
Ответ на: комментарий от kermzyxer

Да, я тоже думаю это из-за ника. Ведь Prolog такой популярный ЯП.

Я точно видел здесь прологофагов. А мой ник всяко безопаснее всяких ubuntu1004.

vurdalak ★★★★★ ()
Ответ на: комментарий от anonymous

Это вроде как открывает поток для прямого чтения файла. Так я и write'ом могу писать. А вот как именно базу из памяти туда запихнуть?

vurdalak ★★★★★ ()

Самый простой способ так:

?- [user].
|: a(1).
|: a(2).
|: a(X) :- b(X,Y), c(Y,X).
|: % user://1 compiled 0.00 sec, 776 bytes
true.

?- tell('foo.pl'), listing(a), told.
true.

?- 
% halt
debian% cat foo.pl 
a(1).
a(2).
a(A) :-
	b(A, B),
	c(B, A).

debian% 
Если нужно поточней выбирать или контролировать вывод, то смотри сюда. Начни, например, с clause/2.

dmsh ()
Ответ на: комментарий от dmsh

tell('foo.pl'), listing(a), told.

Это сохранило мне листинг кода программы. А нужно сохранять то, чего в коде нет, потому что оно добавлялось с помощью assertz.

vurdalak ★★★★★ ()
Ответ на: комментарий от vurdalak

Какая разница как они там оказались?

?- assertz(a(X):-b(X)).
true.

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

a(A) :-
	b(A).

true.

?- 

dmsh ()
Ответ на: комментарий от dmsh

Какая разница как они там оказались?

А, все, заметил. Спасибо. А как сделать так, что в листинге были только определенные правила? Например, у меня есть общее a(X) :- b(X), которое я не хочу сохранять, а есть a(1) :- b(1), которое сохранить нужно. Количество аргументов у них одинаковое, оба есть в программе. Но перовое нет смысла сохранять, оно и так записано. А вот второе сохранено динамически, его нужно сохранять между запусками программы.

vurdalak ★★★★★ ()
Ответ на: комментарий от vurdalak

Можешь сделать как-нибудь так:

:- dynamic a_aux/1.
a_aux(1) :- b(1).
....

a(X) :- a_aux(X).
a(X) :- b(X).

и добавлять/сохранять только a_aux.

Либо смотри первую ссылку.

dmsh ()
Ответ на: комментарий от dmsh

Хорошо. Сохраняет нормально. А обратно как прочитать? consult вроде выполняется, но правила не сохраняет. То есть оно заново просит у меня ввода текста в тех местах, где я уже это сделал и сохранил ответ.

vurdalak ★★★★★ ()
Ответ на: комментарий от vurdalak

Ты что-то делаешь не так.

consult вроде выполняется

Пример в студию.

dmsh ()
Ответ на: комментарий от dmsh
consult('db.txt').

можем_идти(X, Y) :-
    свободно(X, Y).

свободно(X, Y) :-
    известно(X, Y),
    предмет(X, Y, пусто).

свободно(X, Y) :-
    not(известно(X, Y)),
    предмет(X, Y),
    предмет(X, Y, пусто).

предмет(X, Y) :-
    write('Введите название предмета: '),
    read(Object),
    assertz(предмет(X, Y, Object)),
    assertz(известно(X, Y)).

сохранить :-
    tell('db.txt'),
    listing(предмет),
    told.

Записи вида «предмет(1,1,пусто)» должны сохраняться, чтобы в следующий раз не приходилось выполнять read(Object).

vurdalak ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.