【发布时间】:2013-04-06 21:10:40
【问题描述】:
我正在学习 Ivan Bratko 的书:“人工智能编程”,用于大学考试并使用 SWI Prolog,我对本书中关于 assert 和 的示例显示有些疑问>retract 谓词。
它只是呈现以下代码,将一些事实声明为动态:
:-dynamic fast(ann).
:-dynamic slow(tom).
:-dynamic slow(pat).
然后在 Prolog shell 中使用 assert 规则将新规则定义到数据库中:
[debug] 59 ?- assert((faster(X,Y) :- fast(X), slow(Y))).
true.
好的,新规则似乎已添加到我的数据库中。
现在我尝试执行此查询,但失败了:
[debug] 64 ?- faster(X,Y).
false.
书上说输出应该是这个:
A = ann
B = tom
这听起来很好也很合理,因为我参考了之前的程序,其中说指定谁快谁慢,后来我添加了更快的规则来断言它......
为什么不工作?也许这取决于 Prolog 实现(SWI-Prolog)?
【问题讨论】:
-
您对
dynamic指令的使用应仅指示谓词及其参数数量,例如:- dynamic fast/1和:-dynamic slow/1。为这些动态谓词断言事实是一个单独的(运行时)步骤。 -
好的,需要澄清一下
-
有趣的旁注:断言的事物仅在程序执行期间存在于内存中。我正在玩弄它,当我尝试在单独的运行中收回我用
assertz定义的事实时,它失败了,因为没有可收回的东西。要永久添加到知识库,您需要一个带有 append 的输出流。
标签: prolog