Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SWI prolog中的等价谓词是什么?_Prolog - Fatal编程技术网

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

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

在《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中的内置谓词。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).
此时,要么数据库中有a
a(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)。)