我有以下客户创建和列表代码:
:-dynamic customer/2.
load:-consult('C:\\customers.txt').
save:-tell('C:\\customers.txt'), listing(customer), told.
%New customer
new_customer:-write("Name: "), read(Name),
customer_code(Code), asserta(customer(Code, Name)), save.
customer_code(Code):- customer(C, _, _, _), Code is C + 1.
customer_code(1).
到目前为止,这么好。问题是,当我尝试进行更复杂的搜索,过滤和报告时,我不得不使用retract
来清理客户的当前内存状态。
因此,在任何列表之前,我倾向于再次查阅该文件(调用load
):
list_customers:- load, listing(customer).
这里出现的问题是,这次新加载会导致listing
重复添加到数据库的最后一个客户。
例如:
C:\ Customers.txt移动:
:-dynamic customers/2
(2, 'John')
(1, 'Alicia')
列表(客户):
(2, 'John')
(2, 'John')
(1, 'Alicia')
我可以在咨询之前使用retractall
来避免这种情况:
load:- reatractall(customer(_,_)), consult('C:\\customers.txt').
这是一个好/坏的做法?我不太明白这里发生了什么,或者为什么这样才能解决问题。
答案 0 :(得分:0)
参考谓词,如文档中所述,在一个相当模糊的地方引用了一个已弃用的reconsult子句,声明它将重新加载从文件加载的子句。
在这种情况下,这意味着什么?
首次在文本文件中创建条目时,从文件加载的子句和您创建的子句是相同的。
添加新条目时会出现问题。让我们通过一个例子来检查这一点,以便明确:
1)您使用consult
加载文件:
现在您的数据库和文件将包含相同的子句:
Customers.txt移动:
:- dynamic customer/2.
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').
您的Prolog数据库:
:- dynamic customer/2.
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').
到目前为止,非常好。
2)您使用tell
/ told
添加新客户并将其保存到文件中:
Customers.txt移动:
:- dynamic customer/2.
customer(5, 'Juan').
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').
您的Prolog数据库:
:- dynamic customer/2.
customer(5, 'Juan').
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').
仍然没有问题。这是真正的问题:
3)您重新加载文件:
Customers.txt移动:
:- dynamic customer/2.
customer(5, 'Juan').
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').
您的Prolog数据库:
:- dynamic customer/2.
customer(5, 'Juan').
customer(5, 'Juan').
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').
好的,这里发生了什么?如果您还记得,我们之前看到consult
重新加载从文件加载的条款。
所以,我们重新加载的条款是:
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').
这给我们留下了第一次从文件中加载的子句customer(5, 'Juan')
。所以现在我们必须将它添加到我们的数据库中,从而产生:
customer(5, 'Juan').
customer(5, 'Juan').
customer(4, 'Juan').
customer(3, 'Juan').
customer(2, 'Juan').
customer(1, 'Juan').