Command line 在命令行中使用swipl运行prolog代码

Command line 在命令行中使用swipl运行prolog代码,command-line,prolog,server,swi-prolog,Command Line,Prolog,Server,Swi Prolog,我正在搜索swipl类似于perl-e 特别是,我希望以这种方式运行prolog代码: swipl --wanted-flag "fact(a). message:-writeln('hello')." -g "message" -t halt 这是可能的 swipl -f file -g "message" -t halt 其中prolog子句写在文件中 我在服务器端运行swipl,它将用户输入作为prolog子句,因此在服务器上编写文件不是一个好主意。您可以做的一件事是使用标准输入,而

我正在搜索
swipl
类似于
perl-e
特别是,我希望以这种方式运行prolog代码:

swipl --wanted-flag "fact(a). message:-writeln('hello')." -g "message" -t halt
这是可能的

 swipl -f file -g "message" -t halt
其中prolog子句写在
文件中


我在服务器端运行swipl,它将用户输入作为prolog子句,因此在服务器上编写文件不是一个好主意。

您可以做的一件事是使用标准输入,而不是从参数加载(我想您仍然可以将入口点作为参数传递):

在stdin.pl的文件
中说:

main :-
    load_files(stdin, [stream(user_input)]),
    current_prolog_flag(argv, [Goal|_]),
    call(Goal),
    halt.
main :- halt(1).
有了这个,你可以做到:

$ echo 'message :- format("hello~n").' | swipl -q -t main fromstdin.pl -- message
|: hello
@false to的注释和问题将告诉您这是什么
,如果您想知道,但如果它让您烦恼,请执行以下操作:

$ echo 'message :- format("hello~n").' \
    | swipl -q -t main fromstdin.pl -- message \
    | cat
hello
相反


这将允许您从标准输入读取任何Prolog,并从中调用任意谓词。我不知道这样做是否明智。如果有更简单的方法实现同样的效果,我也不会感到惊讶。

您可以预处理输入(很容易使用
read/1
等,因为Prolog程序自然地表示为一系列Prolog术语)和带有
assertz/1
的assert子句。在您的示例中,SWI Prolog的最终调用可能是
swipl-g“assertz(事实(a)),assertz(message:-writeln('hello')),message“-t halt
,预处理后。您的代码对我有效,但在我为应用程序修改它时无效。我的序言代码还包含指令(例如
:-op(601,xfx,(/)。
)。它还使用编译好的prolog代码,我使用以下命令行命令:
echo“bla bla…”swipl-x binary-t main load_code.pl--“online_demo(1)”
,其中
online_demo/1
是在
binary
中定义的。错误如下:
error:“”/1:未定义的过程:main/1错误:但是,存在以下定义:error:main/0