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

标签 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在系统中定义在调用 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/

相关文章:

list - 我找出了测试列表中 a 和 b 相等的代码,但无法理解底层递归

prolog - 跳过/通过非标准序言代码

Prolog-在矩阵中查找单词

prolog - SWI-Prolog - 断言失败

git - Gist.github 序言语法高亮

prolog - Prolog 冒号运算符是什么意思?

prolog - 极其低效且不优雅的代码

prolog - 如何在 Prolog 中模拟软剪辑?

Prolog 变量名以下划线开头,然后大写

list - 是否可以在 Prolog 中编写一个空列表作为差异列表?