这让我想起了 Java 中的设施。那里可以查询
当前调用栈,并用它来调节调用的权限
一个方法。翻译成 Prolog 我们在旧的 DEC-10 Prolog 中找到
以下谓词:
祖先(左)
将 L 与当前子句的祖先目标列表统一起来。
该列表以父目标开始,以最近的目标结束
祖先来自编译子句中的调用。清单已打印
使用 print 并且每个条目前面都有调用编号
括号后跟深度数(如在
跟踪消息)。如果调用没有数字(这将
如果在进一步执行之前未打开调试模式,则会发生)
然后用“-”标记。不适用于已编译的代码。
由于顶层通常是编译谓词 prolog/0,这可能是
用于编写一个谓词检查自己的调用堆栈,然后决定
是否要投入使用。
rule2 :- ancestors(L), length(L,N), N<2, !, write('Don't call me'), fail.
rule2 :- 1<5.
在现代 Prologs 中,我们不再经常发现祖先/1 谓词。
但它可以按照以下方式进行模拟。只需抛出一个错误,然后
如果错误带有堆栈跟踪,您将获得所需的一切:
ancestors(L) :- catch(sys_throw_error(ignore),error(ignore,L),true).
但要注意堆栈消除优化可能会减少堆栈,因此
由祖先/1 返回的列表。
最好的问候
P.S.:这里已经解释了堆栈消除优化:
[4] 沃伦,D.H.D. (1983):A Abstract Prolog Instruction Set,技术说明 309,SRI International,1983 年 10 月
关于 Jekejeke Prolog 的讨论可在此处找到:
http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_pro08/13_press/03_bench/05_optimizations/03_stack.html