Prolog程序中关于事实的错误

Prolog程序中关于事实的错误,prolog,Prolog,我有下面的prolog程序。它是一个简单的问答系统,收集事实并推断出新的结论。它: 通过询问动物的特征来发现动物(使用识别) 描述知识库中任何动物的属性(使用说明) 程序中有一个错误,它说fact/2未定义。此错误仅在询问识别(动物)时发生说明命令工作正常 另外,我知道它有一个非常简单的解决方案,但我找不到它是什么 代码: 追踪是: [trace] 1 ?- recognition(animal). Call: (6) recognition(animal) ? creep Ca

我有下面的prolog程序。它是一个简单的问答系统,收集事实并推断出新的结论。它:

  • 通过询问动物的特征来发现动物(使用
    识别
  • 描述知识库中任何动物的属性(使用
    说明
程序中有一个错误,它说fact/2未定义。此错误仅在询问
识别(动物)
时发生<代码>说明
命令工作正常

另外,我知道它有一个非常简单的解决方案,但我找不到它是什么

代码:

追踪是:

[trace] 1 ?- recognition(animal).
   Call: (6) recognition(animal) ? creep
   Call: (7) rule(_G2040, animal, _G2042, _G2043) ? creep
   Exit: (7) rule(1, animal, mammal, [c1]) ? creep
   Call: (7) discover([c1]) ? creep
   Call: (8) ask(c1) ? creep
   Call: (9) fact(c1, yes) ? creep
   Fail: (9) fact(c1, yes) ? creep
   Redo: (8) ask(c1) ? creep
   Call: (9) fact(c1, no) ? creep
   Fail: (9) fact(c1, no) ? creep
   Redo: (8) ask(c1) ? creep
   Call: (9) write('has it hair?') ? creep
has it hair?
   Exit: (9) write('has it hair?') ? creep
   Call: (9) nl ? creep

   Exit: (9) nl ? creep
   Call: (9) complete(c1) ? creep
   Call: (10) read(_G2043) ? creep
|: yes.
   Exit: (10) read(yes) ? creep
^  Call: (10) assert(fact(c1, yes)) ? creep
^  Exit: (10) assert(fact(c1, yes)) ? creep
   Call: (10) yes=yes ? creep
   Exit: (10) yes=yes ? creep
   Exit: (9) complete(c1) ? creep
   Exit: (8) ask(c1) ? creep
   Call: (8) discover([]) ? creep
   Exit: (8) discover([]) ? creep
   Exit: (7) discover([c1]) ? creep
   Call: (7) found(rule) ? creep
   Call: (8) rule ? creep
ERROR: found/1: Undefined procedure: rule/0
ERROR:   However, there are definitions for:
ERROR:         rule/4
   Exception: (8) rule ? 
添加指令

:- dynamic fact/2.
:- dynamic rule/4.
其目的是在程序开发期间生成有用的消息(正是您所看到的消息)

编辑:刚刚调试-将
retract(rule)
更改为
retract(rule(,,,,,,))
并修复单例
ask(X):-事实(X,是)-应该是
询问(X):-事实(X,是)。那么当我询问

?- recognition(animal).
它启动循环以要求属性。如果要调试,请使用gtrace或trace

编辑:阅读您的跟踪,我认为上述建议必须更改。应该是

:- dynamic fact/2.
:- dynamic rule/0.

而且
retract(规则(,,,,,,))显然是错误的!正确的是原始的
收回(规则)
,很抱歉

我在程序开始时添加了上述两个指令,但现在我运行它并对第一个问题回答“是”或“否”,它没有任何作用。将
retract(rule)
更改为
retract(rule(,,,,,,,,))没有任何效果。除了Capelical的建议,您需要检查谓词
的逻辑是否已找到
。您正在检查
found(rule)
,并试图通过在
found
谓词逻辑中不带参数地询问
规则来检查
规则
(这是您在跟踪中看到的
规则/0
未找到问题)。
:- dynamic fact/2.
:- dynamic rule/0.