SWI-PL: read() 在 writeln() / write() 之后,nl 保留所有先前 write() 的输出

SWI-PL: read() after a writeln() / write(),nl holds out the output of all previous write()

我正在尝试制作一个 prolog 菜单,其中脚本要求用户输入一些数据,所以它全是 write()、read()、nl 和一些 writeln() 的链。

问题是由于某种原因,read() 函数会保留写入的输出,直到所有读取完成。这是一个问题,因为所有这些写入都在告诉用户要输入什么。

我做了一个测试代码来展示会发生什么,因为我的实际项目是一团糟:

test:-
    write("X is "),
    read(X),
    writeln("Y is "),
    read(Y),
    writeln("Z is "),
    read(Z),
    write([X,Y,Z]).

这是我所期望的:

?- test.
X is
|: 1.
Y is
|: 2.
Z is
|: 3.
[1,2,3]
true.

但这就是我得到的:

?- test.
1.
|: 2.
|: 3.
X is Y is Z is [1,2,3]
true.

SWI 是线程化的,64 位,版本 7.6.4,我使用的是 KDE Neon 5.16.2(基于 Ubuntu 18.04,内核 4.15.0-54

您可能想在 write/1 之后使用 flush_output/0,如下所示:

test:-
    write("X is "), flush_output,
    read(X),
    writeln("Y is "), flush_output,
    read(Y),
    writeln("Z is "), flush output,
    read(Z),
    write([X,Y,Z]).

但我实际上无法重现您的问题。使用您的代码,无需任何刷新,我在终端上看到:

?- test.
X is 1.
Y is 
|: 2.
Z is 
|: 3.
[1,2,3]
true.

所以,我们看到了不同的东西。为什么?

  • 我们在不同的操作系统上有不同版本的 SWI-Prolog?
  • 你输入的内容和我输入的不完全一样吗?

很难说。但请务必阅读 the documentation of flush_output/0,那里可能会提供线索。