在下文中,我只考虑纯 Prolog程序。这意味着我不是在谈论副作用和操作系统调用,它们会让逻辑领域做一些在Prolog中无法观察到的事情。
对于Prolog程序的运行时成本,有一个众所周知的抽象度量:逻辑推理的数量。通过“抽象”,我的意思是这个度量独立于任何特定的Prolog实现和实际的具体硬件。从某种意义上说,它是一个度量,它为我们提供了有关执行程序所需时间的一些信息。我们甚至可以通过说明每秒推理的推理次数(LIPS)来在一定程度上指定Prolog系统的性能,这是如此广泛使用,人们可以称之为传统的系统性能测量。传统上,这个数字是通过特定的基准测量的,但“推理数量”的一般概念当然也扩展到其他更复杂的Prolog程序。
然而,据我所知,这个特别的(我敢说:具体的)抽象测量并没有在以下重要意义上说出全部真相:
对于任何给定的Prolog目标G,让我们用 t (G)表示: T →R在特定硬件上给定Prolog系统上G的实际执行时间,即从Herbrand术语到实数的函数。让我们称一个度量α: T →R 如实 iff t (G)≈α(G)所有G,在某种意义上说,这些值因所有目标G和所有“现实”类型的硬件以为界限的因素而不同(我必须将此最后一点略微指定,但我为了简单起见,我假设相同的Prolog实现在“典型”硬件上大致以相同的方式执行。我知道事实并非如此,并且相同的实现可以在不同类型的硬件上表现出截然不同的特性。如果是这样,将定义限制为实现“大致”相同的硬件类型的子集。)
据我所知,逻辑推理的数量一般不是Prolog目标实际执行时间的真实度量,特别是因为时间执行统一所需要的不是它。人们可以构建这种度量与实际执行时间之间的差异不再受常数限制的情况。
因此,我的问题是:对于Prolog目标的运行时间,是否存在真实抽象度量?如果它一般不存在,请指定一个有意义的Prolog程序子集,其中可以定义这样的度量。例如,通过限制可能发生的统一类型。
这个问题具有很高的实际意义,例如在使用Prolog实施智能合约时:在这种情况下,您需要抽象地测量运行Prolog程序所需的时间,即使您的程序也是如此在不同的机器上运行,需要就运行它所花费的时间达成一致,但是您希望保留未来改进具体实现技术的可能性。因此,该度量应仅取决于实际给定的程序,而不取决于实现的任何具体功能,例如访问的存储器单元的数量。
答案 0 :(得分:2)
复杂措施的问题在盛开here。但嘴唇仍然是一个有用的衡量标准。你没有得到:
Point Form1Loc;
public Form2(Point Form1LocationRef)
{
Form1Loc = Form1LocationRef;
InitializeComponent();
}
但你得到:
LIPS ~ TIME
其中深度是运行时术语深度的度量,它会影响统一的时间成本,而计数是子句数量的度量,它会影响统一的数量,包括不会导致推理的失败。
它的抽象就像你说加法需要一个步骤一样,但实际上我们知道添加两个bignums的时间取决于bignums的大小。这里的条款和条款起到了bignums的作用。
有用吗?肯定是的!例如,如果你有两个算法,并且看到深度和计数都相同,你可以用嘴唇来比较它们。