Prolog - 咨询实际清理当前状态?

时间:2015-09-24 21:47:40

标签: prolog

我有以下客户创建和列表代码:

:-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').

这是一个好/坏的做法?我不太明白这里发生了什么,或者为什么这样才能解决问题。

1 个答案:

答案 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').