【问题标题】:Writing in file | Swi-Prolog | Windows写入文件 | Swi-Prolog |视窗
【发布时间】:2011-06-11 19:19:26
【问题描述】:

swi-prolog 5.11.11 的某些脚本在 linux 系统上运行成功,但在 Windows 系统上运行不佳,Swi-Prolog 5.6.48

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,

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

【问题讨论】:

  • 所写的关闭(OS)无法到达; main/0 目标在达到之前就失败了。关闭(OS)不应该在替代条款中完成吗?

标签: prolog


【解决方案1】:

如果想将 close(OS) 保留在“单个”ma​​in/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 通过为每个运算符分配 Precedence 值(用户使用 op/3 定义自己的运算符时),范围从 0 到 1200。

这里也有 the usual convention 的反转,我们通常的意思是高优先级运算符将在低优先级运算符之前应用。但是在 Prolog 中 the lower Precedence value 表示一个操作符首先绑定(被应用)。

实际优先级值因实现而异,但联合 ,Precedence 值低于析取 ;,因此首先绑定。

【讨论】:

    【解决方案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).
    

    【讨论】:

    • Linux 与 Windows 对不正确关闭文件的不同影响可能是由于不同的缓冲策略。显然,在程序终止时,Windows 会关闭文件而不会刷新任何写入缓冲区,从而产生一个空文件。 Linux 更健壮,但正如您所见,程序终止可能会丢失一些字符。
    • @hardmath:这甚至可能不是“稳健性”的问题,而只是操作系统之间不同的缓冲区大小。
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多