SWI-PL: read () после writeln () / write (), nl удерживает вывод всех предыдущих write () - PullRequest
2 голосов
/ 01 июля 2019

Я пытаюсь создать прологическое меню, в котором сценарий просит пользователя ввести некоторые данные, поэтому все это цепочка write (), 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 голосов
/ 01 июля 2019

Возможно, вы захотите использовать 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 на разных ОС?
  • Вы не печатаете точно так же, как я пишу?
* 1016Сложно сказать.Но обязательно прочитайте документацию flush_output/0, там может быть подсказка о том, что происходит.
...