Stream 是否始终需要使用'\n';在Prolog中读取流时?

Stream 是否始终需要使用'\n';在Prolog中读取流时?,stream,prolog,pipe,iso-prolog,Stream,Prolog,Pipe,Iso Prolog,我使用管道与两个Prolog进程通信,每次我到达read/2谓词从管道读取消息时,程序都会被阻塞并保持这样。我不明白为什么会发生这种情况(我尝试了非常简单的程序),最后我意识到了三件事: 每次我使用write/2发送邮件时,发件人进程必须以结束该邮件\n。如果消息不是这样结束的,则接收方进程将卡在read/2谓词处 如果发送方未刷新输出,则消息不会保留在管道缓冲区中。这可能看起来很明显,但一开始我并不这么认为 虽然未刷新消息时,read/2被阻塞,wait\u for\u input/3根本不被

我使用管道与两个Prolog进程通信,每次我到达
read/2
谓词从管道读取消息时,程序都会被阻塞并保持这样。我不明白为什么会发生这种情况(我尝试了非常简单的程序),最后我意识到了三件事:

  • 每次我使用
    write/2
    发送邮件时,发件人进程必须以
    结束该邮件\n
    。如果消息不是这样结束的,则接收方进程将卡在
    read/2
    谓词处
  • 如果发送方未刷新输出,则消息不会保留在管道缓冲区中。这可能看起来很明显,但一开始我并不这么认为
  • 虽然未刷新消息时,
    read/2
    被阻塞,
    wait\u for\u input/3
    根本不被阻塞,因此在这种情况下不需要
    flush\u output/1
  • 示例: 这不起作用:

    example1 :-
        pipe(R,W),
        write(W,hello),
        read(R,S). % The program is blocked here.
    
    那个也不行:

    example2 :-
        pipe(R,W),
        write(W,'hello.\n'), 
        read(R,S). % The program is blocked here.
    
    而这两种方法都能起作用:

    example3 :-
        pipe(R,W),
        write(W,'hello.\n'),
        flush_output(W),
        read(R,S).
    example4 :-
        pipe(R,W),
        write(W,'hello.\n'),
        wait_for_input([W],L,infinite).
    
    现在我的问题是为什么?当从管道中读取时(实际上是从您可能想要读取的任何流中读取),Prolog仅“接受”以句点结尾的完整行有什么原因吗?为什么
    read
    阻塞,而
    等待输入/3
    不阻塞(假设消息未刷新)


    谢谢

    一个有效的Prolog读取项总是以一个句点结束,称为
    end char(*6.4.8*)
    。在6.4.8其他代币中,标准内容如下:

    结束字符后面应跟一个布局字符或
    %

    这就是标准的要求

    除了空格、制表符和其他布局字符以及
    %
    之外,句点后的换行符是结束阅读术语的一种可能性。然而,由于TTY和相关缓冲的流行,只使用换行符似乎是一个好习惯

    之所以需要end char,是因为Prolog语法允许使用中缀和后缀运算符。考虑作为输入< /P>
    f(1) + g(2).
    
    阅读
    f(1)
    时,您可能会认为这已经是整个术语,但您仍然必须等待这段时间,以确保此后没有中缀或后缀

    还请注意,您必须使用
    writeq/1
    write\u canonical/1
    生成可读回的输出。您不能使用
    write/1

    作为一个例子,考虑<代码>写([(+])]。首先,这是有效的语法。点后面紧跟着其他字符。备注

    通常在结尾处称为句点,而在序言文本中称为点

    write/1
    将把它写为
    [.+.]
    。请注意,第一个
    后面跟着一个空格。所以当这段文字被读回时, 只有
    [.
    将被读取

    还有很多其他丑陋的例子,比如这一个,通常它们不会打到你。但是一旦你被击中,你就会被击中