【发布时间】:2023-03-06 19:10:01
【问题描述】:
首先,我不是 prolog 程序员。我正在为我们建立一个小型专家系统的学校做作业。我选择使用 prolog 进行作业,并且正在关注这本书:http://www.amzi.com/distribution/files/xsip_book.pdf。具体来说,我正在看第 2 章。
本书中有一个我想使用的过程,称为“询问”。它可以在第 14 页找到。询问,使用另一个称为“已知”的过程来记住问题的答案。我基本上已经复制了这个过程以在我的代码中使用,但是我遇到了与“已知”过程相关的存在错误。不是prolog程序员,我不知道如何调试它。希望有人可以提供帮助。
这是我的代码运行示例:
| ?- species(X).
uncaught exception: error(existence_error(procedure,known/3),ask/2)
代码如下:
species(limba) :- %There are a bunch of these
distribution(west_africa),
color(tan_with_black_streaks),
figure(plain),
janka_hardness(670),
workability(easy).
distribution(X) :- ask(distribution, X).
color(X) :- ask(color, X).
figure(X) :- ask(figure, X).
janka_hardness(X) :- ask(janka_hardness, X).
workability(X) :- ask(workability, X).
ask(A, V) :-
known(yes, A, V),
!.
ask(A, V) :-
known(_, A, V),
!,
fail.
ask(A, V) :-
write(A:V),
write('? : '),
read(Y),
asserta(known(Y, A, V)),
Y == yes.
【问题讨论】:
-
您想构建一个专家系统,但对编写的语言一无所知?祝你好运。
-
这个程序期望
known/3是动态的(你指的那本书就是这么说的)。也就是说,它是在运行时创建和管理的。 Prolog 文档告诉您如何声明动态谓词。你可能想通读一遍。 -
已修复。正如@lurker 所说, known/3 需要是动态的。我添加了:- 动态(已知/3)。到我的代码,它解决了这个问题。谢谢。
标签: debugging exception prolog