从文件中收回Prolog c#接口

本文关键字:Prolog 接口 文件 | 更新日期: 2023-09-27 17:50:44

我刚刚建立了与SWI Prolog的连接,并想要操纵事实。例如,收回并断言它们

我有一些这样的函数:

       String[] param = { "-q" };
       PlEngine.Initialize(param);
            PlQuery.PlCall("consult('tablets.pl').");
            PlQuery.PlCall("assert(tablet(4,newatomic)).");
            PlQuery.PlCall("tell('tablets.pl'), listing(tablet/2), told.");
            PlQuery.PlCall("retractall(tablet/2).");
            PlQuery.PlCall("assert(tablet(1,n1ewatomic)).");
            PlQuery.PlCall("assert(tablet(2,n2ewatomic)).");
            PlQuery.PlCall("tell('tablets.pl'), listing(tablet/2), told.");

正如您所看到的这个函数,它可以像预期的那样用于断言,但不能用于收回。问题是,我想在插入下一个之前从文件中删除所有的平板电脑事实(它们是动态的)。PlQuery.PlCall("retractall(tablet/2).");这个查询必须删除文件中的所有记录。以及如何删除一个事实,例如tablet(4,newatomic),但不删除另一个事实。

执行后的结果文件为:

:- dynamic tablet/2.
tablet(4, newatomic).
tablet(1, n1ewatomic).
tablet(2, n2ewatomic).

从文件中收回Prolog c#接口

好吧,我不想删除问题,因为它得到了两个赞。也许它会对某人有用。

所以,逻辑是正确的。

当我们想要附加一些东西到数据库时,我们写:

assert(predicat(var1, var2, ... , varn))

当我们想从数据库中删除一些东西时,我们写:

retract(predicat(var1, var2, ... , varn))
retractall(predicat(var1, var2, ... , varn))

如果所有项都相等,则从数据库中删除(并且必须是动态的)

如果我们想删除所有的数据,我们需要通过变量来指定它。所以…

retract(predicat(_,_,...,_))
retractall(predicat(_,_,...,_))

将删除与查询匹配的所有数据。为了保存数据,我们只需在下面写:

tell('database_file.txt'), %opening file for writing
listing(ig_node), %writing
told. %closing/saving file