2010-05-27 4 views
0

У меня возникли проблемы с вложением фактов в существующий файл Prolog без перезаписи исходного содержимого.Добавление фактов в существующий файл пролога

Предположим, у меня есть файл test.pl:

:- dynamic born/2. 

born(john,london). 
born(tim,manchester). 

Если я загрузить это в прологе, и я утверждаю больше фактов:

| ?- assert(born(laura,kent)). 
yes 

Я знаю, что я могу спасти это, делая :

|?- tell('test.pl'),listing(born/2),told. 

который работает, но test.pl содержит теперь лишь факты, а не ": - динамика рожденного/2":

born(john,london). 
born(tim,manchester). 
born(laura,kent). 

Это проблематично, потому что если я перезагрузите этот файл, я не смогу вставить больше фактов в test.pl, потому что «: - dynamic born/2.» больше не существует.

Я где-то читал, что я мог бы сделать:

append('test.pl'),listing(born/2),told. 

, который нужно просто добавить в конец файла, однако, я получаю следующее сообщение об ошибке:

! Existence error in user:append/1 
! procedure user:append/1 does not exist 
! goal: user:append('test.pl') 

Btw, я м с использованием пролога Sicstus. Это имеет значение?

Спасибо!

+0

Я думаю, что вы должны подписаться на соответствующие ответы [утверждать факт в файл в прологе] (http://stackoverflow.com/questions/2885718/assert-fact-into-file-in-prolog). Или даже [Prolog - ASSERT и RETRACT] (http://stackoverflow.com/questions/2435237/prolog-assert-and-retract) – ony

+0

Используйте 'open/3' и' close/1' вместо устаревшего 'tell' , 'tell',' append' – false

ответ

2

Неудивительно, что в нем содержатся только факты, так как это все, что вы сказали ему сохранить. Самый простой способ - использовать

|?- tell('test.pl'), write(':- dynamic born/2.'), nl, listing(born/2), told. 

или написать небольшую процедуру, которая делает это. В зависимости от того, как вы собираетесь использовать это, вы можете использовать save_program/1/2 и restore/1.

Я не могу помочь вам append/1 Боюсь.

+1

Для SWP-Prolog нет необходимости писать '' 'декларирование' born/2' напрямую. Это делается с помощью 'listing (born/2)'. – ony

+0

Большое спасибо, это наверняка действительно работает. Я посмотрю, как я могу использовать save_program и восстановить. – vuj

Смежные вопросы