如何在swi-prolog中的prolog文件中运行prolog查询?

时间:2017-05-28 21:19:31

标签: prolog

如果我有一个定义规则的prolog文件,并在windows中的prolog终端中打开它,它会加载事实。但是,它显示?-提示我手动输入内容。如何将代码添加到文件中,以便它实际评估这些特定语句,就像我输入它一样?

类似这样的事情

dog.pl

dog(john).
dog(ben).

% execute this and output this right away when I open it in the console
dog(X).

有谁知道怎么做?

由于

3 个答案:

答案 0 :(得分:5)

此目的有一个ISO 指令(以及更多):initialization 如果您有一个文件,请将dog.pl放在一个文件夹中,并附上此内容

dog(john).
dog(ben).

:- initialization forall(dog(X), writeln(X)).

当您查阅文件时

?- [dog].
john
ben
true.

答案 1 :(得分:2)

请注意,仅断言dog(X).不会将dog(X)作为查询调用,而是尝试断言作为事实或规则,它将执行并警告单个变量。

这是一种以您描述的方式执行执行的方法(这适用于SWI Prolog,但不适用于GNU Prolog):

foo.pl内容:

dog(john).
dog(ben).

% execute this and output this right away when I open it in the console
%  This will write each successful query for dog(X)
:- forall(dog(X), (write(X), nl)).

这样做会写出dog(X)查询的结果,然后通过false调用强制回溯到dog(X),这将找到下一个解决方案。这种情况一直持续到没有更多的dog(X)解决方案最终失败。 ; true确保true最终失败时调用dog(X),以便在将所有成功查询写入dog(X)后整个表达式成功。

?- [foo].
john
ben
true.

您也可以将其封装在谓词中:

start_up :-
    forall(dog(X), (write(X), nl)).

% execute this and output this right away when I open it in the console
:- start_up.

如果要运行查询然后退出,可以从文件中删除:- start_up.并从命令行运行它:

$ swipl -l foo.pl -t start_up
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.2.3)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

john
ben
% halt
$

答案 2 :(得分:0)

dog.pl:

dog(john).
dog(ben).

run :- dog(X), write(X).
% OR:
% :- dog(X), write(X).  
% To print only the first option automatically after consulting.

然后:

$ swipl
1 ?- [dog].
% dog compiled 0.00 sec, 4 clauses
true.

2 ?- run.
john
true ;   # ';' is pressed by the user 
ben
true.

3 ?-