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

如何在prolog文件中指定事实?,prolog,logic-programming,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 writ

我在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

我真的不知道发生了什么事。我试着寻找一些文件加载的定义,以及它与谷歌上的解释器是如何不同的,但是没有用。

你应该考虑警告意味着什么:它正在替换所有的事实,然后当你查询<代码>?内存(0,1,0)。< /代码>没有可供选择的搜索。

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

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


您可以验证数据库内容发布<代码> ->清单(内存).<代码> < /p> < p>您应该考虑警告意味着什么:它正在替换所有的事实,然后当您查询<代码>?内存(01,1)。< /代码>没有可供选择的搜索。

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

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


您可以通过发出
?-列表(内存)来验证数据库内容。

如果您在
[user]下输入所有三个事实。
您将实际获得与使用文件
['test.pl']
相同的行为。因此,该行为与为
内存断言多个事实有关,并且在断言它们的不同方式中是一致的。如果您在
[user]下输入所有三个事实。
您将实际获得与使用文件
['test.pl']
相同的行为。因此,这种行为与为
内存
断言的事实不止一个有关,并且在断言它们的不同方式中是一致的。啊,我没想到!谢谢我还不熟悉/3语法,所以我没有意识到这意味着所有3个定义都被替换了。好吧,我最初的问题是基于错误的假设-让我困惑的事情实际上总是正确的(为什么它认为当3个中只有一个与我的查询完全匹配时,可能会有更多的解决方案?)。事实上,匹配可能是一个相当复杂的操作,通过设计Prolog算法,必须尝试匹配(统一)任何可能的子句。任何现代Prolog实现都有第一个参数索引,这意味着在简单的情况下,引擎实际上可以“跳转”到第一个匹配的参数。但在你的例子中,这三个子句的索引是相等的。啊,没想到!谢谢我还不熟悉/3语法,所以我没有意识到这意味着所有3个定义都被替换了。好吧,我最初的问题是基于错误的假设-让我困惑的事情实际上总是正确的(为什么它认为当3个中只有一个与我的查询完全匹配时,可能会有更多的解决方案?)。事实上,匹配可能是一个相当复杂的操作,通过设计Prolog算法,必须尝试匹配(统一)任何可能的子句。任何现代Prolog实现都有第一个参数索引,这意味着在简单的情况下,引擎实际上可以“跳转”到第一个匹配的参数。但在您的案例中,这三个子句的索引是相等的。