我如何从命令行 运行 prolog 文件而不是放到 repl 中?
How do I run a prolog file from the command line and not drop to the repl?
我正在尝试从命令行执行序言脚本。我的尝试基于我在 How to run SWI-Prolog from the command line? 发现的内容
然而,这不适用于任何重要的示例(即除 "hello world" 示例之外的任何示例)。
:- initialization(main, program).
main :-
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
parent(X,jim).
halt.
我使用 $ swipl -q -s temp.p
执行此操作并得到以下错误
Warning: temp.p:10:
Singleton variables: [X]
ERROR: temp.p:11:
No permission to modify static procedure `halt/0'
Defined at /opt/local/lib/swipl/boot/init.pl:3867
如何从命令行执行此操作,获取结果,但不拖放到 repl?
你最大的问题是你的源代码有不少问题。我已经像这样修复了它们:
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
main :-
parent(X,jim),
format('~a is the parent of jim~n', [X]),
halt.
既然程序没有错误,您可以通过在命令行上提供目标来执行它而无需返回 repl:
$ swipl -q -s temp.pl -g main
pat is the parent of jim
$
为了“只是 运行 一个脚本”而无需手动指定目标,您可以像问题中那样使用 initialization
,并进行一些调整。
如果我们创建一个具有以下内容的可执行parentage.pl
文件:
#!/usr/bin/env swipl
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
:- initialization parent(X,jim), writeln(X), halt.
然后我们可以 运行 它并输出解决方案,正如预期的那样:
# ./parentage.pl
pat
我正在尝试从命令行执行序言脚本。我的尝试基于我在 How to run SWI-Prolog from the command line? 发现的内容 然而,这不适用于任何重要的示例(即除 "hello world" 示例之外的任何示例)。
:- initialization(main, program).
main :-
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
parent(X,jim).
halt.
我使用 $ swipl -q -s temp.p
执行此操作并得到以下错误
Warning: temp.p:10:
Singleton variables: [X]
ERROR: temp.p:11:
No permission to modify static procedure `halt/0'
Defined at /opt/local/lib/swipl/boot/init.pl:3867
如何从命令行执行此操作,获取结果,但不拖放到 repl?
你最大的问题是你的源代码有不少问题。我已经像这样修复了它们:
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
main :-
parent(X,jim),
format('~a is the parent of jim~n', [X]),
halt.
既然程序没有错误,您可以通过在命令行上提供目标来执行它而无需返回 repl:
$ swipl -q -s temp.pl -g main
pat is the parent of jim
$
为了“只是 运行 一个脚本”而无需手动指定目标,您可以像问题中那样使用 initialization
,并进行一些调整。
如果我们创建一个具有以下内容的可执行parentage.pl
文件:
#!/usr/bin/env swipl
parent(pam,bob).
parent(tom,bob).
parent(tom,liz).
parent(bob,ann).
parent(bob,pat).
parent(pat,jim).
:- initialization parent(X,jim), writeln(X), halt.
然后我们可以 运行 它并输出解决方案,正如预期的那样:
# ./parentage.pl
pat