在“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/3
。 known/3
本身用于标记属性/值对是否在数据库中。我尝试过使用assert/1
:
assert(known(Y,A,V)).
但我不确定这是否正确。
另外,
write('The answer is '), write(X), nl.
监听器报告存在语法错误,并且需要运算符。然而,在解决的第二个定义中,没有问题。
什么是SWI-Prolog的等价物,我如何修复语法错误?谢谢你的帮助!
答案 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.