2016-11-14 80 views
2

我使用Prolog和clpd来解决布尔问题。我有如下这样的规则:用prolog在txt文件中打印结果

:- use_module(library(clpb)). 

fun(A, B, C, D, E) :- 
    sat(A + B + C, D), 
    sat(E), 
    labeling([A, B, C, D, E]); 

是否可以在文件中打印结果?我能怎么做?

+1

的http://stackoverflow.com/q/18674731/535275 –

+0

我不知道,如果是重复的可能重复...其他线程说说列表。这里是布尔逻辑,看着另一个线程,我不明白如何在txt上写结果。 – NxA

+2

究竟哪一个结果?你打算如何运行这个程序?你能显示你的文本文件应该包含什么吗? – 2016-11-14 19:55:59

回答

2

你的代码有一些简单的错误。你可以试试这个版本(改变了一些小东西):

:- use_module(library(clpb)). 

fun(A, B, C, D, E) :- 
    open('test1234.txt',write,ID), 
    ( sat(A + B + C + D), 
     sat(E), 
     labeling([A, B, C, D, E]), 
     write(ID, labeling([A, B, C, D, E])),nl(ID), fail 
     ; close(ID) 
    ). 

如果你现在查询:

?- fun(A,B,C,D,E). 
true. 

“test1234.txt” 将E在当前工作目录中创建。该“test1234.txt”文件包含:

labeling([0,0,0,1,1]) 
labeling([0,0,1,0,1]) 
labeling([0,0,1,1,1]) 
labeling([0,1,0,0,1]) 
labeling([0,1,0,1,1]) 
labeling([0,1,1,0,1]) 
labeling([0,1,1,1,1]) 
labeling([1,0,0,0,1]) 
labeling([1,0,0,1,1]) 
labeling([1,0,1,0,1]) 
labeling([1,0,1,1,1]) 
labeling([1,1,0,0,1]) 
labeling([1,1,0,1,1]) 
labeling([1,1,1,0,1]) 
labeling([1,1,1,1,1]) 
+2

不错!在任何情况下,通过使用'setup_call_cleanup/3'来可靠地关闭文件,你可以做得更好。 – mat

+0

是的,我的错误是非常愚蠢的,我用同一个流两个不同的名字,关于“nl”我不知道这个窍门,但它完美的作品。 无论如何,如果我希望保存结果并在prolog终端(我使用SWI-Prolog)中显示结果,我应该怎么做?因为atm只能保存结果。 – NxA

+0

谢谢@mat !!!我不知道setup_call_cleanup/3,所以谢谢! – coder