SWI-Prolog没有显示结果

时间:2014-05-02 14:52:49

标签: prolog

我是Prolog的初学者,现在我被卡住了,因为Prolog没有告诉我任何结果。我正在阅读一些教程,他们都有一个像这样的示例代码:

main.
human(ann).
human(george).
human(mike).

?- bagof(H, human(H), Humans).
% Expected result:
% Humans = [ann, george, mike].

?- human(Who).
% Expected result:
%
% Who = ann;
% Who = george;
% Who = mike.

但我得到的所有输出都是:

Warning: /Users/admin/prolog/test.pl:105:
    Singleton variables: [Who]
% test.pl compiled 0.00 sec, 34 clauses
true.

或者:

Warning: /Users/admin/prolog/test.pl:105:
    Singleton variables: [Humans]
% test.pl compiled 0.02 sec, 1,409 clauses
true.

我做错了什么?我真的读了我能做的一切,但所有的手册都说这样的代码必须返回结果。但它不适合我。

SWI-Prolog版本: 6.6.5 for x86_64-darwin13.1.0

OS: MAC OS X 10.9.2 Maverix

3 个答案:

答案 0 :(得分:2)

您似乎在文件本身中编写查询,而不是在Prolog顶层解释器中尝试查询。 {(1}}等文件中的查询(通常)以静默方式执行。您文件中的查询也是您获取单例变量警告的原因。如果您希望嵌入源文件中的查询输出任何内容,则需要显式添加必要的调用以输出结果。

答案 1 :(得分:2)

如果你回到你一直在看的教程,他们应该明确(正如@PauloMoura指出的那样)在Prolog中查询文件和在交互式提示符下与Prolog交互之间存在差异。

如果您只是在未咨询文件的情况下运行Prolog,则可以手动输入事实和规则,然后按ctrl-D完成。例如:

? - [user].
|: human(ann).
|: human(george).
|: human(mike).
|: % user://1 compiled 0.00 sec, 2 clauses
true.

然后您可以通过键入(在显示的提示符下)进行查询:

?- human(Who).
Who = ann ;
Who = george ;
Who = mike.

?- bagof(H, human(H), Humans).
Humans = [ann, george, mike].

?-

如果您想将文件放入文件中,可以将事实放在一个文件中,例如humans.pl

human(ann).
human(george).
human(mike).

然后查阅Prolog提示中的文件:

?- [humans].
% humans compiled 0.00 sec, 5 clauses
true.

然后执行上面显示的查询(再次,在这种情况下手动),结果相同:

?- human(Who).
Who = ann ;
Who = george ;
Who = mike.

?- bagof(H, human(H), Humans).
Humans = [ann, george, mike].

这些输出由交互式提示提供。如果你想拥有文件中的所有内容,你需要在文件中有一个谓词,它将使用I / O函数输出你想要的信息。

所以我们可以让humans.pl看起来像这样:

human(ann).
human(george).
human(mike).

?- human(Who), write(Who), nl, fail.

?- bagof(H, human(H), Humans), write(Humans), nl.

然后你会得到:

?- [humans].
ann
george
mike
Warning: /home/mark/src/prolog/_play_/humans.pl:5:
        Goal (directive) failed: user: (human(_G606),write(_G606),nl,fail)
[ann,george,mike]
% humans compiled 0.00 sec, 5 clauses
true.

?-

出现警告是因为第一个查询失败(用于执行回溯以获得更多结果)。你可以通过为该查询添加一个替代的真实路径来摆脱这种失败:

?- human(H), write(H), nl, fail ; true.

或者,您可以引入单个谓词来输出所有人:

human(ann).
human(george).
human(mike).

show_humans :-
    human(H),
    write(H), nl,
    fail.
show_humans.

?- show_humans.

?- bagof(H, human(H), Humans), write(Humans), nl.

结果是:

?- [humans].
ann
george
mike
[ann,george,mike]
% humans compiled 0.00 sec, 7 clauses
true.

答案 2 :(得分:0)

如果您想在批处理模式下使用Prolog,而不是在交互模式下,可以在human.pl中编写代码。

:- initialization main.

human(ann).
human(george).
human(mike).

main :- 
    bagof(X, human(X), L),
    write(L),
    halt.

使用swipl human.pl运行它(我使用swi prolog)。然后,结果将是:

% human.pl compiled 0.00 sec, 6 clauses
[ann,george,mike]