gpt4 book ai didi

recursion - Prolog 跟踪解释器在执行递归程序时无法进入无限循环

转载 作者:行者123 更新时间:2023-12-01 03:46:36 26 4
gpt4 key购买 nike

我在 Ivan Bratko 写的名为 Prolog Programming For Artifical Intelligence 3rd edition 的书中找到了这个跟踪元解释器,它看起来像这样:

trace(Goal):-
trace(Goal, 0).

trace(true, Depth):-!.
%I added those below because I want to allow numeric operations
trace(A > B, Depth):-!.
trace(A < B, Depth):-!.
trace(A = B, Depth):-!.
trace(A is B, Depth):-!.
trace((Goal1, Goal2), Depth):-!,
trace(Goal1, Depth),
trace(Goal2, Depth).
trace(Goal, Depth):-
display('Call: ', Goal, Depth),
clause(Goal, Body),
Depth1 is Depth + 1,
trace(Body, Depth1),
display('Exit: ', Goal, Depth),
display_redo(Goal, Depth).
trace(Goal, Depth):-
display('Fail: ', Goal, Depth),
fail.

display(Message, Goal, Depth):-
tab(Depth), write(Message),
write(Goal), nl.

display_redo(Goal, Depth):-
true
;
display('Redo: ', Goal, Depth),
fail.

有人可以解释为什么这个跟踪元解释器无法跟踪像阶乘或斐波那契数这样的递归程序吗?

我使用 SWI-Prolog 版本 6.6.6。

最佳答案

您添加了几个内置谓词,如 (>)/2 :

trace(A > B, Depth):-!.

但是您提供的解释只是说:它总是正确的。因此,您的程序永远不会终止。相反,提供实际的解释:
trace(A > B, _Depth) :- !,
A > B.

另外,请注意您会收到很多关于 void 变量的警告:使用 _删除案例作为这个。

关于recursion - Prolog 跟踪解释器在执行递归程序时无法进入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475365/

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