Prolog 目标运行时间成本的真实抽象度量

Posted

技术标签:

【中文标题】Prolog 目标运行时间成本的真实抽象度量【英文标题】:Truthful abstract measure for run time cost of a Prolog goal 【发布时间】:2017-12-29 09:37:05 【问题描述】:

在下文中,我只考虑 Prolog 程序。这意味着我不是在谈论离开逻辑领域去做一些在 Prolog 中无法观察到的副作用和操作系统调用。

Prolog 程序的运行时间成本有一个众所周知的抽象度量逻辑推理的数量。通过“抽象”,我的意思是这个度量独立于任何特定的 Prolog 实现和实际的具体硬件。从某种意义上说,它是一个度量,它为我们提供了一些关于执行程序所需时间的信息。我们甚至可以通过说明 Prolog 系统的 每秒推理次数 (LIPS) 来在一定程度上指定 Prolog 系统的性能,这被广泛使用,以至于人们可以将其称为系统性能的传统衡量标准。传统上,这个数字是通过特定的基准来衡量的,但“推理次数”的一般概念当然也扩展到其他更复杂的 Prolog 程序。

但是,据我了解,这个特殊的(我敢说:具体)抽象度量并没有在以下重要意义上说出全部真相:

对于任何给定的 Prolog 目标 G,让我们用 t(G) 表示:T→R 在特定的给定 Prolog 系统上 G 的实际执行时间硬件,即从 Herbrand 项到实数的函数。让我们称量度为 α:T→R truthful iff t(G) ≈所有 G 的 α(G),从某种意义上说,对于所有目标 G 和所有“现实”类型的硬件,值的差异以常数为界(我必须离开最后一点稍微未指定,但为了简单起见,我在这里假设相同的 Prolog 实现在“典型”硬件上以大致相同的方式执行。我知道事实并非如此,并且相同的实现可以在不同类型的硬件上表现出截然不同的特性硬件。如果是这样,请将定义限制为硬件类型的子集,其中实现“大致”相同。)

据我所知,逻辑推理的数量通常不是 Prolog 目标的实际执行时间的真实度量,特别是因为时间执行统一所需的时间不是由它衡量的。可以构建这种度量与实际执行时间之间的差异不再受常数限制的情况。

因此,我的问题是:Prolog 目标的运行时间是否有一个真实抽象度量?如果它一般不存在,请指定一个有意义的 Prolog 程序子集,其中可以定义这样的度量。例如,通过限制可能发生的统一类型。

这个问题具有很高的实际意义,例如在使用 Prolog 实现智能合约时:在这种情况下,您希望抽象地测量运行 Prolog 程序需要多长时间,即使您的程序在不同的机器上运行,这些机器需要就运行它所花费的时间达成一致,但您希望保留未来改进具体实现技术的可能性。因此,该度量应该仅取决于实际给定的程序,而不取决于实现的任何具体特征,例如访问的内存单元的数量。

【问题讨论】:

向我展示一个很好的抽象度量,用于添加整数。我没见过这样的。应该包含一些 ld。 出于终止推断的目的,为 cTI 开发了一些措施,但它们严重高估了运行时间。 如果我理解正确,那么为什么达到目标的机制仅限于 Prolog。我在想,如果你有一个可以用完美的引擎来解决特定问题的目标,那么你所寻求的是引擎上达到目标的完美动作的最少数量。我能想到的最好的比喻是解决旅行商问题。问题定义明确,引擎众所周知,任何答案的衡量标准都很容易比较。只是大声思考。 :) 经过更多思考并将其与神经网络联系起来,虽然网络可以有很多层,但也可以只有一层并通过将每个可能的输入直接连接到每个可能的输入来获得完美的结果有效输出和成本始终相同。 也许我们可以相当准确地测量 WAM,并从那里汇总一些统计数据(分析器可以提供现成的东西?) 【参考方案1】:

复杂性度量的问题正在盛开here。但嘴唇仍然是一种有用的测量方法。你没有得到:

LIPS ~ TIME

但你得到:

LIPS * DEPTH * COUNT ~ TIME

其中深度是运行时术语深度的度量,它影响统一的时间成本,计数是子句数量的度量,它影响统一的数量,包括不导致推理的失败。

它的抽象就像你说加法需要一个时间步一样,但实际上我们知道两个大数相加的时间取决于大数的大小。在这里,条款和从句扮演了大人物的角色。

有用吗?肯定是的!例如,如果您有两种算法,并且看到深度和计数都相同,您可以使用嘴唇来比较它们。

【讨论】:

以上是关于Prolog 目标运行时间成本的真实抽象度量的主要内容,如果未能解决你的问题,请参考以下文章

在 Swi-prolog 中增加运行时的堆栈大小

快速在 Prolog 中运行

成本函数训练目标与准确度期望目标

以真实设备为目标时,无法在 IOS 中构建 react-native

Prolog 中是不是可以进行自适应解析?

是否可以从 C# 运行 prolog?