SWI Prolog没有';不显示结果

SWI Prolog没有';不显示结果,prolog,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 = geor

我是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.
human(ann).
human(george).
human(mike).

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

?- bagof(H, human(H), Humans), write(Humans), nl.
但我得到的结果是:

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

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

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


OS:MAC OS X 10.9.2 Maverix

您似乎是在文件本身中编写查询,而不是在Prolog顶级解释器中尝试查询。文件中的查询(如
?-human(Who)。
通常以静默方式执行。文件中的查询也是获得singleton变量警告的原因。如果要将查询嵌入源文件以输出所需的任何内容,则需要显式添加必要的调用以输出结果。

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

如果您返回到所阅读的教程,它们应该清楚地说明这一点(正如@PauloMoura指出的)在Prolog中查询文件和在Prolog的交互提示下与Prolog交互是有区别的

如果只运行Prolog而不查阅文件,则可以手动输入事实和规则,然后按
ctrl-D
完成。例如:

? - [user].
|: human(ann).
|: human(george).
|: human(mike).
|: % user://1 compiled 0.00 sec, 2 clauses
true.
然后,您可以通过键入(在显示的提示下)进行查询:

如果你想把东西放在一个文件里,你可以把事实放在一个文件里,比如说,
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
看起来像这样:

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.
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.

如果你回到你一直在看的教程中,他们应该清楚(正如@PauloMoura指出的)在Prolog中查阅文件和在Prolog的交互提示下与Prolog交互是有区别的

如果只运行Prolog而不查阅文件,则可以手动输入事实和规则,然后按
ctrl-D
完成。例如:

? - [user].
|: human(ann).
|: human(george).
|: human(mike).
|: % user://1 compiled 0.00 sec, 2 clauses
true.
然后,您可以通过键入(在显示的提示下)进行查询:

如果你想把东西放在一个文件里,你可以把事实放在一个文件里,比如说,
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
看起来像这样:

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.
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.

如果希望在批处理模式而不是交互模式下使用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]

如果希望在批处理模式而不是交互模式下使用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]

main.
的目的是什么?@lower它是为sublime的prolog插件设计的。没有它就不行。但在使用控制台执行时,它也不会改变任何东西。
main.
?@lower的目的是什么?@lower它是为sublime的prolog插件设计的。没有它就不行。但在使用控制台执行时,它也不会改变任何东西。那么,我应该做些什么来获得输出呢?“添加必要的调用”是什么意思?例如,
?-human(Who)、writeq(Who)、nl.
?-human(Who)、writeq(Who)、nl、fail.
。但是为什么不直接在顶层输入查询呢?那么我应该做些什么来获得输出呢?“添加必要的调用”是什么意思?例如,
?-human(Who)、writeq(Who)、nl.
?-human(Who)、writeq(Who)、nl、fail.
。但是为什么不直接在顶层输入查询呢?谢谢你和@PauloMoura!谢谢你和@PauloMoura!