ISO Prolog谓词的复杂性

Tud*_*riu 8 prolog time-complexity iso-prolog

标准Prolog谓词的时间复杂度是否有上限保证?

例如:在任何符合标准的Prolog系统中,是否确定sort(+List, ?SortedList)在O(nlog(n))时间(n是长度List)中运行?

fal*_*lse 7

tl;博士:不,不.

让我们从sort/2理想情况下开始进行n ld(n)比较.很好,但一次比较需要多长时间?我们来试试吧:

tails(Es0, [Es0|Ess]) :-
   Es0 = [_|Es],
   tails(Es, Ess).
tails([],[[]]).

call_time(G,T) :-
   statistics(runtime,[T0|_]),
   G,
   statistics(runtime,[T1|_]),
   T is T1 - T0.

| ?- between(12,15,I), N is 2^I, length(L,N),maplist(=(a),L),
     tails(L,LT), call_time(sort(LT,LTs), Tms).
Run Code Online (Sandbox Code Playgroud)

在SICStus 4.3.1和SWI 7.1.28上

I = 12, N = 4096,   Tms_SICS =   680,  Tms_SWI =   3332
I = 13, N = 8192,   Tms_SICS =  2800,  Tms_SWI =  14597
I = 14, N = 16384,  Tms_SICS = 11300,  Tms_SWI =  63656
I = 15, N = 32768,  Tms_SICS = 45680,  Tms_SWI = 315302
Run Code Online (Sandbox Code Playgroud)

通过复制大小,我们可以轻松估计运行时的内容.如果它也重复,则它是线性的,如果它是四倍,则它是二次的.显然,两者至少具有二次运行时间.

以抽象的方式描述精确的运行时可能是可能的,但很难确保一切都很好.无论如何,在标准文件中强制要求具体承诺几乎是不可能的.此外,验证此类声明非常困难.

最好的抽象度量可能是推论的数量,通常可以很容易地观察到.查看最大的整数因子.但同样,这只是一个抽象的衡量标准 - 所以有些事情已被撕掉,abstraxit.情况很可能也是关键特征已被撕掉.

一般而言,ISO标准ISO/IEC 13211-1:1995核心并未要求对运行时复杂性提出任何保证,这些复杂性明显超出范围.它在一个说明中明确提到资源限制也超出了范围:

1范围

....

注 - ISO/IEC 13211的本部分未规定:

a)Prolog文本的大小或复杂性将超过
任何特定数据处理系统或语言
处理器的容量,或
超出相应限制时应采取的措施;
...

永远记住,技术标准是确保系统适合某种目的的先决条件.这不是一个充分的条件.参见下的示例目的这个答案对于一个有点极端的例子.

  • 请重读一下这个问题:这不是关于排序的算法,而是关于`sort/2`. (2认同)
  • @jschimpf:请重读OP的问题:它是否确定`sort/2`是否运行O(n ld n).我给出了一个这个边界不成立的例子,因为该公式没有考虑参数的大小. (2认同)