Prolog C#接口从文件中撤消

时间:2015-05-25 12:59:12

标签: c# prolog

我刚刚建立了与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).

1 个答案:

答案 0 :(得分:0)

好吧,不想删除一个问题,因为它有两个upvotes。也许这对某人有用。

所以,逻辑是正确的。

每当我们想要将某些东西附加到数据库时,我们写道:

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

每当我们想要从数据库中删除某些东西时,我们写下:

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

如果所有条款都相同,则从db中删除(也必须是动态的)

如果我们要删除所有数据,我们需要通过Variable指定它。所以......

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

将删除与查询匹配的所有数据。为了保存数据,我们接下来写一下:

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