Command line 从终端查询不';不要打印任何东西

Command line 从终端查询不';不要打印任何东西,command-line,prolog,swi-prolog,Command Line,Prolog,Swi Prolog,在命令行中运行时 swipl -g "write(42)" -t "halt" 按预期将42打印到标准输出 但是, swipl -g "X = 42" -t "halt" 不打印任何内容,它只是返回 如何让它打印在REPL中打印的内容(即,X=42) 注意:这是在Windows终端中。让我知道这是否在Linux终端中有效。正如所料,X=42本身不会产生任何输出,因为(=)/2是一个完全纯谓词,本身不会产生任何副作用。Windows、OSX和所有其他操作系统都是如此 即使有一种方法可以获取和重

在命令行中运行时

swipl -g "write(42)" -t "halt"
按预期将42打印到标准输出

但是,

swipl -g "X = 42" -t "halt"
不打印任何内容,它只是返回

如何让它打印在REPL中打印的内容(即,
X=42


注意:这是在Windows终端中。让我知道这是否在Linux终端中有效。

正如所料,
X=42
本身不会产生任何输出,因为
(=)/2
是一个完全纯谓词,本身不会产生任何副作用。Windows、OSX和所有其他操作系统都是如此

即使有一种方法可以获取和重定向toplevel输出本身,但事实仍然是SWItoplevel可能会发生更改,并且您不能依赖将来的版本以与现在相同的方式运行。从长远来看,你可能会更好地推出你自己的顶级产品,生产出你想要的产品

要达到自己的最高水平并不难。技巧主要是在阅读术语时使用
variable_names/1
选项,以便跟踪要在答案中显示的变量names。这是一个非常简单的开始:

答复:- 读取线路至代码(当前输入,代码), 从代码(代码、术语、[变量名称(名称变量)])中读取术语, 通话(期限), 报表绑定(名称变量)。 答复:答复。 报表绑定(名称变量):- 短语(绑定(名称变量),Bs), 格式(“~s”,[Bs])。 绑定([])-->[]。 绑定([E])-->name_var(E)。 绑定([E1,E2|Rest])-->name_var(E1),“,\n”,绑定([E2|Rest])。 名称\变量(名称=变量)--> 格式“(~w=~q)”,[Name,Var])。 格式\(格式,Ls)--> 调用(格式\ U代码(格式,Ls))。 格式代码(格式、Ls、Cs0、Cs):- 格式(代码(Cs0,Cs),格式,Ls)。 例如:

?- repl. |: X = 4, between(1, 3, Y). X = 4, Y = 1 true ; X = 4, Y = 2 true ; X = 4, Y = 3 true ; |: X = 7. X = 7 ?-答复。 |:X=4,介于(1,3,Y)之间。 X=4, Y=1 是的; X=4, Y=2 是的; X=4, Y=3 是的; |:X=7。 X=7 修改它很容易,因此它可以在指定为参数的术语上工作

请注意,
variable_names/1
选项对于以这种方式读取术语是必不可少的,由于iso标准化工作,越来越多的实现为
read_term/2
和相关谓词提供了该选项

这种读取变量名的能力是实现可移植Prolog toplevel的一个要求


我留给你们的主要练习是检查引用是否在所有情况下都是正确的,并且(如果需要的话)以这样一种方式产生答案,它们总是可以粘贴回终端上。要将此扩展到剩余的约束,请使用
copy\u term/3
调用\u residence\u vars/2
来收集可以附加到绑定的挂起约束。

使用
和\u output\u To/2
似乎没有任何作用“按预期将42打印到STDOUT”。没有更多吗?“true”或“yes”如何?重复一下,它不会打印true,这可能与它不打印
X=42
时发生的问题完全相同。基本上,似乎所有直接打印到STDOUT的东西都是打印出来的,但是所有“由REPL打印”的东西都不是打印出来的。对于一开始就应该工作的东西来说,这似乎需要做很多工作。如果无法直接获得查询结果,那么能够在REPL外部运行查询又有什么意义呢?在命令行上执行单个目标与REPL完全不同,通常从shell脚本运行SWI时不需要REPL交互,因此,到目前为止,只有少数实例值得考虑REPL。我同意它应该更加模块化,事实上,我希望我们可以共同开发一个更加模块化的REPL,它在与Prolog解释器进行交互的其他情况下也会很有用!我认为得到一个基本的RePL运行不是很难,我希望你考虑结束这一点。不要忘记使用写选项<代码> ValuabyNosi/1 写可读变量。 ?- repl. |: X = 4, between(1, 3, Y). X = 4, Y = 1 true ; X = 4, Y = 2 true ; X = 4, Y = 3 true ; |: X = 7. X = 7