我有一些事实存储在文件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上的解释器的不同之处,但无济于事。
答案 0 :(得分:1)
你应该考虑警告意味着什么:它正在取代所有事实,然后当你查询?- memory(0,1,0).
时,没有其他搜索选择。
然后,当可以成为更多解决方案时,您得到的是yes
,而不是true
。
似乎gprolog确实计算了第一个参数索引,并且因为在第一个场景中有更多的事实,0作为第一个参数,它合理地等待你的选择。
您可以验证发出?- listing(memory).