Prolog 如何保持通向另一个进程的管道处于打开状态

Prolog 如何保持通向另一个进程的管道处于打开状态,prolog,swi-prolog,Prolog,Swi Prolog,我正试图通过管道与bc实例进行对话,但我的代码每次都会运行新实例。在我关闭连接之前,是否可以保持连接的持久性 :-使用_模块(库(unix))。 :-使用_模块(库(进程))。 读取结果(输出,结果):- 读出(结果)。 发送命令(R、命令、结果):- 写入(R.in,命令), 荷兰, 冲洗输出(R.in), 读取结果(R.out,result)。 %使用pid和输入/输出管道创建结构 开放式会话(R):- %管道(输入、输出), 创建过程(路径(bc), %bc-q [“-q”], [stdi

我正试图通过
管道
bc
实例进行对话,但我的代码每次都会运行新实例。在我关闭连接之前,是否可以保持连接的持久性

:-使用_模块(库(unix))。
:-使用_模块(库(进程))。
读取结果(输出,结果):-
读出(结果)。
发送命令(R、命令、结果):-
写入(R.in,命令),
荷兰,
冲洗输出(R.in),
读取结果(R.out,result)。
%使用pid和输入/输出管道创建结构
开放式会话(R):-
%管道(输入、输出),
创建过程(路径(bc),
%bc-q
[“-q”],
[stdin(管道(In)),
标准装置(管道(出口)),
工艺流程(Pid)],
dict_create(R,bcinstance,[pid:pid,in:in,out:out])。
关闭\u实例(R):-
关闭(R.in.),
关闭(R.out),
工艺压井(R.pid)。
使用_命令(命令,O):-
公开课(R),
发送命令(R,命令,O),
关闭_实例(R)。

如果我对_命令使用
(“2+3”,O)。
它似乎只是等待输入,而不是输出“5”,不知道为什么。

首先,管道会一直持续下去,直到其中一个进程关闭它

除了一个小问题外,您的示例几乎可以正常工作:

read/2
需要一个序言词,然后需要一个点。由于进程不发出
read/2
等待进一步的输入

一种解决方案:例如使用
读取行到行代码/2
而不是
读取/2

read_result(Out, Codes) :- read_line_to_codes(Out, Codes). 读取结果(输出,代码):- 读取线到代码(输出,代码)。 示例查询:

?- with_command("2+3", O). O = [53]. ?使用_命令(“2+3”,O)。 O=[53]。 核查:

?- X = 0'5. X = 53. ?-X=0'5。 X=53。
如果让
读取字符/2
,那就太好了,不是吗?

请您稍微更改一下示例以使用通用Unix实用程序,例如
bc
或子shell?该连接实际上应该一直存在,直到您关闭它或进程关闭它为止。@mat按照您的建议将示例更改为“bc”。问题仍然是一样的。似乎
read\u string/5
也有效:是的。然而,字符串对于不同的Prolog系统的可移植性要差得多,所以我尽量避免使用它们。