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

时间:2019-07-01 00:00:00

标签: prolog swi-prolog

我正在尝试创建一个序言菜单,脚本在该菜单中要求用户输入一些数据,因此所有这些都是链写(),read(),nl以及也许是writeln()的。

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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,可能会发现正在发生的事情。