gpt4 book ai didi

prolog - SWI 序言中的等效谓词是什么?

转载 作者:行者123 更新时间:2023-12-02 01:30:07 30 4
gpt4 key购买 nike

在“序言中的专家系统”一书中,我遇到了一个障碍。书中定义了一个简单的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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com