ISO-Prolog谓词的复杂性

ISO-Prolog谓词的复杂性,prolog,time-complexity,iso-prolog,Prolog,Time Complexity,Iso Prolog,对于标准Prolog谓词的时间复杂度上界是否有任何保证 例如:是否确定在任何符合标准的Prolog系统中,sort(+List,SortedList)在O(nlog(n))时间内运行(n是List)的长度?tl;医生:没有,也没有 让我们从sort/2开始,理想情况下需要n个ld(n)比较。很好,但是一次比较需要多长时间?让我们试试这个: tails(Es0, [Es0|Ess]) :- Es0 = [_|Es], tails(Es, Ess). tails([],[[]]). c

对于标准Prolog谓词的时间复杂度上界是否有任何保证

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

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).
关于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
通过复制大小,我们可以很容易地估计运行时是什么。如果它也复制,它是线性的,如果它是四倍,它是二次的。显然,两者至少都有二次运行时

以抽象的方式描述精确的运行时是可能的,但很难确保一切正常。无论如何,几乎不可能在标准文件中规定具体承诺。此外,很难证实这种说法

最好的抽象度量可能是推论的数量,通常它们很容易被观察到。看到或看到。但再一次,这只是一个抽象的衡量标准——因此有些东西被撕掉了,abstraxit。很可能关键特性也被删除了

一般来说,ISO标准ISO/IEC 13211-1:1995 core并不要求对运行时的复杂性提供任何保证,这些复杂性显然超出了范围。 它在注释中明确提到,资源限制也超出了范围:

1范围

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

a) 序言文本的大小或复杂性将超过
任何特定数据处理系统或语言的容量
处理器,或当相应的
超出限制


始终记住,技术标准是确保系统适合某些用途的先决条件。这不是一个充分条件。请参阅中“目的”下的示例,了解一个有点极端的示例。

答案有点漏洞百出。很明显,OP想知道是否有一个对排序算法复杂性的保证,在所有文献中,排序算法都是在恒定时间比较的假设下给出的。请重新阅读这个问题:这不是关于排序算法本身,而是关于
排序/2
。在您的计时中,您可以将列表长度加倍,同时将平均元素大小加倍。也就是说,要排序的数据翻了四倍,然后在运行时观察到4-5倍的增长。这既不是衡量排序复杂度的常规方法,也不适合谈论二次复杂度(需要一个N^2项)。@jschimpf:请重读OP的问题:这是关于是否确定
sort/2
运行O(N ld N)。我举了一个例子,这个边界不成立,因为公式没有考虑参数的大小。