在“序言中的专家系统”一书中,我遇到了一个障碍。书中定义了一个简单的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
在系统中定义在调用 abolish 以删除 known/3
之前的任何定义之后. known/3
本身用于标记属性/值对是否在数据库中。我试过使用 assert/1
:assert(known(Y,A,V)).
但我不确定这是否正确。
此外,在
write('The answer is '), write(X), nl.
监听器报告存在语法错误并且需要操作符。然而,在解决的第二个定义中,没有问题。
SWI-Prolog 的等价物是什么,我该如何修复我的语法错误?谢谢你的帮助!
最佳答案
我认为在 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
do 是完全删除谓词的任何知识,因此它根本没有定义,并且如果您尝试对其进行评估,则会出现错误。什么 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.
关于prolog - SWI 序言中的等效谓词是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34783323/