2011-01-19 41 views
2

一些脚本被束缚水饱和度,Prolog的工作成功通过SWI-Prolog的5.11.11的Linux系统上,但不能很好地在Windows系统48年6月5日写入文件| Swi-Prolog |视窗

main :- 
    open('output.txt',write,OS), 
    elements(Points), 
    get_set(Eq, Points), 
    alpha_isotone(Eq, Points), 
    write(OS,Eq),nl(OS), 
    false, 
    close(OS). 

问题 - 在Windows文件输出.txt为空,所有信息都保留在伪终端中。 在linux下它运行良好,但文件结尾经常被忽略。像

>> tail output.txt  
[6,1,3,6,6,6] 
[6,1,6,6,6,6] 
[6,3,1,6,6,6] 
[6,3,3,6,3,6] 
[6,3,3,6,5,6] 
[6,3,3,6,6,6] 
[6,3,6,6,6,6] 
[6,6,1,6,6,6] 
[6,6,3,6,6,6] 
[6,6,6, 

我在做什么错? (我的英语除外)

+2

正如书面关闭(OS)无法达到; ** main/0 **目标在达到之前就会失败。关闭(OS)不应该在另一个条款中完成吗? – hardmath 2011-01-19 14:54:27

回答

3

如果一个人想保持密切(OS)“单一” 主/ 0子句中,这也适用:

main :- 
    open('output.txt',write,OS), 
    ( elements(Points), 
     get_set(Eq, Points), 
     alpha_isotone(Eq, Points), 
     write(OS,Eq),nl(OS), 
     false 
     ; 
     close(OS) 
    ). 

不建议使用这种语法,因为除非您经常使用这种编码,并且它比larsmans提供的版本的可读性更差,否则很难记住连接,与拆分;的优先级是什么。

Prolog的限定操作员的相对优先级,即使对于AND,OR,以及“颈部” :-,通过分配优先值给每个(用户为此与OP/3定义他们自己的运营商时),测距从0到1200.

这里还有一个 the usual convention的逆转,因为我们通常意味着较高优先级的运算符将被应用在较低优先级的运算符之前。但在Prolog the lower Precedence value中表示运算符首先绑定(应用)。

实际优先级值与所述实施方式而改变,但结合,具有比析取;优先值,从而第一结合。

2

我假设这是一个失败驱动的循环。它不起作用,因为@hardmath说,close/1调用永远不会到达,因为在同一个子句中它前面有fail/1。实际上,输出文件显然不会被刷新。这种故障驱动回路应写为:

main :- 
    open('output.txt', write, OS), 
    main(OS). 

main(OS) :- 
    elements(Points), 
    get_set(Eq, Points), 
    alpha_isotone(Eq, Points), 
    write(OS,Eq), nl(OS), 
    false. 
main(OS) :- close(OS). 
+0

对不正确关闭的文件,Linux与Windows的不同影响,可能是由于不同的缓冲策略。显然,在程序终止时,Windows会关闭文件而不会刷新任何写入缓冲区,从而生成一个空文件。 Linux更健壮,但正如你所看到的,程序终止可能会失去几个字符。 – hardmath 2011-01-19 16:37:45