【发布时间】:2015-09-24 21:47:39
【问题描述】:
我有以下用于创建和列出客户的代码:
:-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').
这是一种好/坏的做法吗?我不太明白这里发生了什么或为什么这能解决问题。
【问题讨论】:
-
这是一个很棘手的问题:见reconsult/1
-
您确定您必须为这个程序使用 Prolog 数据库吗?如果您可以重新设计它,您将避免一整类问题,这样您就不必使用
consult、assert、retract等。 -
无论哪种方式,单独的动态数据库的更好解决方案可能是使用像 library(persistency) 这样的库。
-
我强烈支持 Boris 写的:避免使用
assertz/1等。对于您的用例,您可以简单地使用include/1来包含外部数据库,并且在您重新咨询时也会再次读取它。 (SWI-Prolog:试试make/0。) -
感谢大家的建议.. 遗憾的是我正在上课,这就是应该解决的方式
标签: prolog prolog-directive-dynamic