SWI-Prolog的:如何插入一个新的条款,数据库(SWI-Prolog: how to inse

2019-10-21 02:56发布

对不起,这可能已经问过,但我不能找到一个很好的答案。

我正在写一个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失踪。

我会怎么做这是否正确?

Answer 1:

tell开始写入文件的开头。 所以你覆盖一切,这是在文件中。 您有以下选择:

  1. 把你的progenitor谓词(和只是)在另一个文件。

  2. 使用append/1写入与所述文件的末尾portray_clause 。 这不仅有利于为insert ,但你说你想要delete了。

  3. 阅读其他条款成一个列表,并重新打印,然后用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



文章来源: SWI-Prolog: how to insert a new clause to a database
标签: prolog