1

我有一些事实存储在文件 test.pl 中。

memory(0, 0, 0).
memory(0, 1, 0).
memory(0, 2, 0).

现在在同一个目录中,我启动 gprolog 并加载文件。

| ?- ['test.pl'].
compiling /home/cib/projects/prolog/test.pl for byte code...
/home/cib/projects/prolog/test.pl compiled, 3 lines read - 501 bytes written, 5 ms

yes

但它会奇怪地处理加载的事实。尝试查询其中之一:

| ?- memory(0, 1, 0).

true ? h
Action (; for next solution, a for all solutions, RET to stop) ? ;

no

就像它试图列出一些统一,只是没有变量可以统一。如果我用 [user] 指定事实,就没有问题。

| ?- [user].
compiling user for byte code...
memory(0, 1, 0).

user compiled, 2 lines read - 229 bytes written, 10237 ms
warning: user:1: redefining procedure memory/3
         /home/cib/projects/prolog/test.pl:1: previous definition

yes
| ?- memory(0, 1, 0).

yes

我真的不知道发生了什么事。我试图寻找一些关于文件加载如何工作以及它与谷歌解释器有何不同的定义,但无济于事。

4

1 回答 1

1

您应该考虑警告的含义:它正在替换所有事实,然后当您查询时?- memory(0,1,0).,没有其他选择可以搜索。

然后你得到yes,而不是true你得到什么时候可能有更多的解决方案。

似乎确实 gprolog 只计算第一个参数索引,并且由于在第一种情况下有更多的事实以 0 作为第一个参数,它合理地等待您的选择。

您可以验证发出的数据库内容?- listing(memory).

于 2013-10-08T15:55:26.340 回答