什么是SWI prolog中的等价谓词?

时间:2016-01-14 06:51:17

标签: prolog

在“prolog专家系统”一书中,我遇到了障碍。本书定义了一个简单的shell如下:

solve :-
   abolish(known, 3),
   define(known, 3),
   top_goal(X),
   write('The answer is '),
   write(X),
   nl.
solve :-
   write('No answer found.'),
   nl. 

但是,谓词define似乎不是SWI-Prolog中的内置谓词。定义的目的是确保在调用废除以删除known/3的任何先前定义之后,在系统中定义谓词known/3known/3本身用于标记属性/值对是否在数据库中。我尝试过使用assert/1

assert(known(Y,A,V)).

但我不确定这是否正确。

另外,

write('The answer is '), write(X), nl.

监听器报告存在语法错误,并且需要运算符。然而,在解决的第二个定义中,没有问题。

什么是SWI-Prolog的等价物,我如何修复语法错误?谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

我认为在SWI-Prolog中你应该能够使用dynamic(known/3)来实现define(known, 3)应该做的事情。我想根据您的需求而不是abolish(known, 3), define(known, 3),您应该使用retractall(known(_,_,_))

比如说,如果条件满足,你有一个谓词应该成功,否则你会失败,并且你查询:

?- a(7).

此时,您在数据库中的某个位置a(7).,然后查询成功。或者您没有a(7).,但Prolog知道谓词a/1,因此查询失败。或者,a/1根本没有定义,并且您收到错误(例外)。

abolish做的是完全删除谓词的任何知识,因此根本没有定义,如果你试图评估它就会出错。 retractall的作用是删除谓词的所有子句,并确保系统知道谓词。 dynamic的作用是它在编译时或运行时(!)向系统声明一个谓词,这样对谓词的调用就不是错误,即使谓词本身没有子句。

?- a(7).
ERROR: toplevel: Undefined procedure: a/1 (DWIM could not correct goal)
?- dynamic(a/1).
true.

?- a(7).
false.

?- abolish(a/1).
true.

?- a(7).
ERROR: toplevel: Undefined procedure: a/1 (DWIM could not correct goal)
?- retractall(a(_)).
true.

?- a(7).
false.

?- assertz(a(7)).
true.

?- a(7).
true.