2011-04-26 64 views
2

如何将从prolog程序获得的所有解决方案写入文件?写入gprolog中的文件

+0

其实,有一些非常接近的问题。 http://stackoverflow.com/questions/4736384/writing-in-file-swi-prolog-windows – 2011-04-26 13:10:10

回答

4

简短的回答是将调用嵌套到重复/失败循环中的“解决方案”谓词,在倒数第二步将解决方案写入文件。

由于这篇文章很少涉及涉及什么样的解决方案的细节(并且因此术语的写作可能是多么困难,例如,如果希望能够通过读取写入的文件来重新实例化一个或多个术语在某个时刻),让我们从一个简单的例子开始,其中解决方案只是整数。

我们有以下的非确定性谓词:

mySolution(X) :- for(X,1,10). 

为/ 3为GNU Prolog的一个内置的谓词。 SWI-Prolog在/ 3和Amzi之间有类似的谓词。 Prolog有用于/ 4,并带有额外的参数,允许增量为+1以外的值。用户实现将是:

for(Low,Low,High) :- Low =< High. 
for(New,Low,High) :- 
    Now is Low + 1, 
    Now =< High, 
    for(New,Now,High). 

使得目标mySolution(X)会以可预测的有限数量的方式取得成功。

文件输出可以通过使用GNU-Prolog的流功能或通过执行控制台输出的命令行重定向来实现。我们将说明第一种可能性,尽管第二种可能在许多情况下更简单和更灵活。

main :- 
    open('myOutput.txt',write,ID), 
    ( (mySolution(X), write(ID,X), nl(ID), fail) 
     ; close(ID) 
    ). 

像许多Prolog的实现,GNU-Prolog的提供上谓语几个流和非流变种,你可以找到here the relevant documentation。对于开放关闭看在this linkthat link

补充:我扔在NL/1调用输出文件分开的解决方案。

+0

+1的详细答案。真的很有用 – 2011-04-26 18:56:12

+0

@hardmath:'mySolution(N)'不会终止,也不会有一个有效的表达式作为参数。所以这个文件永远不会被关闭。 – false 2012-06-26 13:55:33

+0

@false:很好,我会解决的! – hardmath 2012-06-26 14:53:59