1

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

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

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

4

1 回答 1

0

咨询谓词,如文档中所述,在一个相当模糊的地方引用了已弃用的重新咨询子句,声明它将重新加载从文件中加载的子句。

在这种情况下,这意味着什么?

当您第一次在文本文件中创建条目时,从文件中加载的子句与您创建的子句是相同的。

添加新条目时会出现问题。让我们用一个例子来检查一下,以使事情变得清晰:

1)您加载文件consult

现在您的数据库和文件将包含相同的子句:

客户.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

客户.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)您重新加载文件:

客户.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').

好的,这里发生了什么?如果你还记得,我们之前看到过从文件中加载的consultreload 子句。

所以,我们重新加载的条款是:

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').
于 2015-09-25T11:32:42.443 回答