SWI prolog中的等价谓词是什么?
在《prolog中的专家系统》一书中,我遇到了一个障碍。本书定义了一个简单的shell,如下所示:SWI prolog中的等价谓词是什么?,prolog,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中的内置谓词。defi
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中的内置谓词。define的目的是确保在调用discreate以删除known/3
之前的任何定义后,在系统中定义谓词known/3
known/3
本身用于标记属性/值对是否在数据库中。我已尝试使用assert/1
:
assert(known(Y,A,V)).
但我不确定这是否正确
还有,在
write('The answer is '), write(X), nl.
侦听器报告存在语法错误,需要运算符。然而,在solve的第二个定义中,没有问题
SWI Prolog的等价物是什么?如何修复语法错误?谢谢你的帮助 我认为,在SWI Prolog中,您应该能够使用
动态(已知/3)
来实现与定义(已知,3)
应该做的相同的功能。我想,为了满足您的需要,您应该使用retractall(已知(,,,,))而不是discreate(已知,3),define(已知,3)
比方说,您有一个谓词,如果满足条件,则该谓词应成功,否则将失败,您可以查询:
?- a(7).
此时,要么数据库中有aa(7)。
,则查询成功。或者您没有a(7)。
,但是Prolog知道谓词a/1
,因此查询失败。或者,a/1
根本没有定义,您会得到一个错误(异常)
要做的是完全删除谓词的任何知识,这样它就根本没有定义,如果您尝试对它求值,就会得到一个错误。其作用是删除谓词的所有子句,并确保系统了解谓词。它在编译时或运行时(!)向系统声明一个谓词,这样对谓词的调用就不会是错误,即使谓词本身没有子句
?- 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.
在此之前,你可以考虑一个更具概括性的Prolog教材。这本书中有一些非常特殊的代码,其中一些在风格上也有点过时。我熟悉基本知识:事实、规则、谓词、子句、变量、原子和统一。谷歌谓词(X):-不知道定义(X)。)