你如何在prolog文件中指定事实?

时间:2013-10-08 15:23:53

标签: prolog logic-programming

我有一些事实存储在文件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

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

1 个答案:

答案 0 :(得分:1)

你应该考虑警告意味着什么:它正在取代所有事实,然后当你查询?- memory(0,1,0).时,没有其他搜索选择。

然后,当可以成为更多解决方案时,您得到的是yes,而不是true

似乎gprolog确实计算了第一个参数索引,并且因为在第一个场景中有更多的事实,0作为第一个参数,它合理地等待你的选择。

您可以验证发出?- listing(memory).

的数据库内容