我如何从命令行 运行 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