gpt4 book ai didi

prolog - 在 SWI-Prolog 中断言新规则的一些问题

转载 作者:行者123 更新时间:2023-12-04 02:58:12 24 4
gpt4 key购买 nike

我正在为大学考试学习 Ivan Bratko 的书:“人工智能编程”并使用 SWI Prolog,我对本书中关于 的示例展示有一些疑问。断言 收回 谓词。

它只是呈现以下代码,将一些事实声明为动态:

:-dynamic fast(ann).
:-dynamic slow(tom).
:-dynamic slow(pat).

然后在 Prolog shell 中使用 断言 将新规则定义到数据库中的规则:
[debug] 59 ?- assert((faster(X,Y) :- fast(X), slow(Y))).
true.

好的,新规则似乎已添加到我的数据库中。

现在我尝试执行此查询但它失败了:
[debug] 64 ?- faster(X,Y).
false.

在书上说输出应该是这个:
A = ann
B = tom

这听起来不错而且合理,因为我已经查阅了之前的程序,其中说指定谁快谁慢,后来我添加了更快的规则来断言它......

为什么不工作?也许这取决于 Prolog 实现(SWI-Prolog)?

最佳答案

dynamic Prolog 中的指令在编译程序中很有用(通常在要编译的源文件中使用)。如果您使用 assert或者在交互式 shell 中创建事实(或规则)的等效机制,那么 SWI-Prolog 已经假定这些谓词是动态的。

然而dynamic在为谓词定义任何事实之前,您希望通过规则中的子句引用谓词的情况下,指令很有用。也就是说,假设我们首先这样做:

?- assert((faster(X,Y) :- fast(X), slow(Y))).
true.

然后尝试查询:
?- faster(X,Y).

您可能会认为这只会失败,因为 fast/1 尚不存在(尚)事实。或 slow/1 .但实际上 SWI-Prolog 会(按设计)抛出错误异常:
ERROR: faster/2: Undefined procedure: fast/1

为了防止这种情况,我们应该在用户输入模式下添加动态指令:
?- [user].
|: :-dynamic fast/1, slow/1.
|: (type Ctrl-z to exit user entry mode)
% user://1 compiled 0.00 sec, 1 clauses

现在我们将获得预期的失败行为(假设先前断言的规则):
?- faster(X,Y).
false.

您可以使用相同的模式来创建您的事实:
?- [user].
|: fast(ann).
|: slow(tom).
|: slow(pat).
|: (type Ctrl-z to exit user entry mode)
% user://2 compiled 0.00 sec, 4 clauses
true.

现在 faster查询以两种不同的方式成功:
?- faster(X,Y).
X = ann,
Y = tom ;
X = ann,
Y = pat.

关于prolog - 在 SWI-Prolog 中断言新规则的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16003575/

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