在命令行中使用swipl运行Prolog代码

4

我正在寻找与perl -e类似的swipl功能。特别地,我想以这种方式运行Prolog代码:

swipl --wanted-flag "fact(a). message:-writeln('hello')." -g "message" -t halt

这是可以用以下方式实现的:
 swipl -f file -g "message" -t halt

代码库使用file文件编写prolog条款。

我在服务器端运行swipl,以prolog条款形式接受用户输入,因此在服务器上编写文件不是一个好主意。


2
你可以预处理输入,(因为Prolog程序具有Prolog项的自然表示形式,所以使用read/1等很容易),并使用assertz/1插入子句。在你的例子中,预处理后最终调用SWI Prolog的方式可能是 swipl -g "assertz(fact(a)), assertz(message :- writeln('hello')), message" -t halt - mat
1个回答

4
您可以尝试使用load_files/2命令和stream选项,从标准输入加载代码,而不是从参数中加载(确保您仍然可以将入口点作为参数传递)。例如,在一个名为fromstdin.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对这个答案和问题的评论会告诉您,但如果它让您感到烦恼,只需执行以下操作:

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

取而代之。

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


你的代码对我有效,但是当我修改它用于我的应用程序时,它就不起作用了。我的Prolog代码还包含指令(例如 :- op(601, xfx, (/)).)。 它还使用编译后的Prolog代码,我使用以下命令行命令:echo "bla bla..." | swipl -x binary -t main load_code.pl -- 'online_demo(1)',其中 online_demo/1binary 中定义。 错误如下: ERROR: '<meta-call>'/1: Undefined procedure: main/1 ERROR: However, there are definitions for: ERROR: main/0 - Fibo Kowalsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接