节省空间的功能符号书写

fal*_*lse 7 list prolog iso-prolog

就辅助空间消耗而言,编写功能符号通常非常昂贵。这对于列表的规范编写尤其重要。

首先考虑输出的大小:对于长度为n的列表,通常的ignore_ops(false)书写需要至少2n+1 个字符,如 in ,规范书写至少需要7n+2 个字符,如。(添加:)无法更改输出,因为它是这样定义的,但是,编写过程中还有很大的改进空间:[1,2,3]'.'(1,'.'(2,'.'(3,[])))

现在考虑编写输出所需的辅助空间:用方括号编写列表不需要任何与列表长度成正比的辅助空间。朴素的规范写作需要与列表长度成比例的空间来表示缩进堆栈。

如何在没有这种开销的情况下规范地编写列表?


这是一个简单的测试,用于检查系统中发生的情况。

首先,减少最大虚拟内存大小以减少您的等待时间,一些 180M-ish 适合我。

$ ulimit -v -180000
Run Code Online (Sandbox Code Playgroud)

nat_sx(N0, s(X)) :-
   N0 > 0,
   N1 is N0-1, nat_sx(N1,X).
nat_sx(0, 0).

?- open('/dev/null',write,Null),
   length(_,I), N is 10^I, nat_sx(N,SX),
   ( Res=unwritten ; write_canonical(Null,SX) ).
Run Code Online (Sandbox Code Playgroud)

SICStus 和 SWI 现在都在write_canonical(Null, SX). 预计它们会在nat_sx/2. 列表的直接比较是不可能的,因为 SWIwrite_canonical/1总是使用方括号。