如何从命令行运行prolog文件而不将其放到repl



我正在尝试从命令行执行prolog脚本。我的尝试是基于我在"如何从命令行运行SWI Prolog?"?然而,这对于任何非平凡的示例(即,除了"你好世界"示例之外的任何其他示例(都不起作用。

:- 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
$

To"只是运行一个脚本";无需手动指定目标,您可以像问题中那样使用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

最新更新