函数编程语言scheme的所有实现都必须在适用时执行tail-call-optimization。
iso-prolog是否有此要求和/或类似要求?
对我来说很明显,Prolog处理器广泛采用了诸如第一个自变量主函子索引和原子垃圾收集 之类的功能,但没有被ISO标准规定。 >
但是prolog-cut呢?
请相信某些Prolog系统可以正确使用语义,但不能保证...
rep.
rep :- !, rep.
rep.
?- rep, false.
...可以在恒定的堆栈空间下永久运行吗?
该系统是否仍然符合ISO-Prolog?
答案 0 :(得分:3)
每当您阅读标准时,请首先查看其范围(领域应用程序,областьприменения,Anwendungsbereich)。因此,该标准是否适用于您想知道的内容。在13211-1:1995中,1范围有一个注释:
注意-ISO / IEC 13211的此部分未指定:
a)Prolog文本的大小或复杂性将超过
任何特定数据处理系统或语言的容量
处理程序,或相应的操作
超出限制;b)数据处理系统的最低要求
能够支持Prolog的实现
处理器;...
严格来说,这只是一个注释。但是,如果您通过该标准,您将意识到不存在此类要求。对于类似情况,另请参见this answer。
进一步,在“执行的任何阶段”都可能发生资源错误(7.12.2小时)和系统错误。
从历史上看,DEC10的早期实现不包含最后调用优化,程序员投入了大量精力来使用故障驱动的循环或启用对数堆栈。
在您的示例rep
中,符合标准的系统可能空间不足。而且该溢出可能带有资源错误,但由于系统可能会因系统错误而纾困,所以即使这不是必需的。令我更恼火的是以下程序
rep2 :- rep2.
rep2.
即使此程序可能无限运行也不会耗尽空间!而且尽管没有人削减额外的选择点。
总而言之,回想一下,符合标准只是工作系统的前提。