某些脚本在Linux系统上通过swi-prolog 5.11.11成功运行,但在Swi-Prolog 5.6.48的Windows系统上运行不太好
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文件 output.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,
我做错了什么? (除了我的英文)
答案 0 :(得分:3)
如果想要将关闭(OS)保持在“单个” main / 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表示运算符首先绑定(已应用)。
实际优先级值因实施而异,但合并,
的优先级值低于分离;
,因此会先绑定。
答案 1 :(得分: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).