2010-05-27 67 views
0

我無法將事實插入到現有的序言文件中,而無需覆蓋原始內容。將事實添加到現有的序言文件

假設我有一個文件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因爲「: - 動態出生/ 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') 

順便說一句,我m使用Sicstus prolog。這是否有所作爲?

謝謝!

+0

我認爲你應該訂閱問題的答案[斷言事實到文件中的序言](http://stackoverflow.com/questions/2885718/assert-fact-int-file-in-prolog)。甚至[Prolog - ASSERT和RETRACT](http://stackoverflow.com/questions/2435237/prolog-assert-and-retract) – ony 2010-05-27 19:11:25

+0

使用'open/3'和'close/1'而不是過時的'tell' ,'tell','append' – false 2014-06-15 08:50:30

回答

2

這並不奇怪,它只包含事實,因爲這是你已經告訴它保存的所有事實。最簡單的方法是使用

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

或者寫一個這樣做的小程序。根據你打算如何使用這個,你可以考慮使用save_program/1/2restore/1。我不能幫你append/1恐怕我不能幫你。

+1

對於SWP-Prolog,不需要直接寫'born'的聲明。它通過'listing(born/2)'完成。 – ony 2010-05-29 15:20:09

+0

非常感謝,這當然確實有效。我將介紹如何使用save_program和restore。 – vuj 2010-06-01 09:26:50