对不起,这可能已经问过,但我不能找到一个很好的答案。
我正在写一个Prolog的分配,在此我们必须写一个数据库,插入,删除,等我目前停留在插入部分。 我想用讲,上市并告诉了这一点,但结果往往是不可预测的,删除文件的随机配件。 这里是我的数据库的完整代码banco.pl
:
:- dynamic progenitor/2.
progenitor(maria,joao).
progenitor(jose,joao).
progenitor(maria,ana).
progenitor(jose,ana).
insere(X,Y) :- dynamic progenitor/2, assert(progenitor(X,Y)).
tell('banco.pl'), listing(progenitor), told.
然后,我运行SWI-Prolog的以下内容:
insere(luiz,luiza).
并获得以下结果banco.pl
:
:- dynamic progenitor/2.
progenitor(maria, joao).
progenitor(jose, joao).
progenitor(maria, ana).
progenitor(jose, ana).
请注意,我试图插入该条款甚至在文件中,行确定提交和insere失踪。
我会怎么做这是否正确?
tell
开始写入文件的开头。 所以你覆盖一切,这是在文件中。 您有以下选择:
把你的progenitor
谓词(和只是)在另一个文件。
使用append/1
写入与所述文件的末尾portray_clause
。 这不仅有利于为insert
,但你说你想要delete
了。
阅读其他条款成一个列表,并重新打印,然后用listing/1
:
(文本格式化)
read_all_other_clauses(All_Other_Clauses):-
see('yourfilename.pl'),
read_all_other_clauses_(All_Other_Clauses,[]),
seen.
read_all_other_clauses_(Other,Acc0):-
(read(Clause) ->
(Clause = progenitor(_,_) -> % omit those clauses, because they'll be printed with listing/1
read_all_other_clauses_(Other,Acc0);
read_all_other_clauses_(Other,[Clause|Acc0]));
Other = Acc0). % read failed, we're done
operation(Insert, X,Y):-
(call,(Insert) ->
assert(progenitor(X,y));
retract(progenitor(X,y))),
read_all_other_clauses(Others),
tell('yourfilename.pl'), % After the reading!
maplist(portray_clause,Others), %Maplist is a SWI built-in, easy to rewrite, if you don't have it.
listing(progenitor/2),
told.
insert(X,Y):- operation(true,X,Y).
delete(X,Y):- operation(fail,X,Y).
请注意,您可以使用read_all_other_clauses
为您delete
而已,如果你改变与省略注释的行。 然后,你可以使用#2你提出的解决方案insere