我是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
答案 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]