gpt4 book ai didi

concurrency - Prolog 延迟评估 : LIFO or FIFO wake-up?

转载 作者:行者123 更新时间:2023-12-04 12:52:52 25 4
gpt4 key购买 nike

许多 Prolog 系统都有 freeze/2谓词,谓词
应该有名称 geler/2因为它是
甚至在 Prolog-II 之前发明。

假设我对同一个变量有一个条件,但有两个
不同的目标,即:

 ?- freeze(X, G1), freeze(X, G2), X=1.

首选的唤醒策略是什么,是先执行G1
还是先执行 G2?如果 G1 和 G2 确实产生新的怎么办
卡住,也被唤醒:
 G1 :- freeze(Y, G3), Y=1.
G2 :- freeze(Z, G4), Z=1.

G3 或 G4 是否总是在 G1 和 G2 之间执行,或者它可以是
G3 或 G4 在 G1 和 G2 之后执行,甚至在任何时间之后执行?

再见

最佳答案

这取决于如何在引擎盖下实现 freeze/2 。可以发挥作用的两种主要类型的属性变量接口(interface)是关于唤醒的类型 1 和类型 2。即:

类型 1:后统一
唤醒将在 X 被实例化并且当前目标成功之后,在调用下一个目标之前发生。使用这种类型,卡住的目标会看到任何实例化,但执行不是立即的,而且并非总是如此。

类型2:预统一
唤醒将在统一期间实例化 X 之前发生。预统一对 freeze/2 没有任何意义,因为那时卡住的目标不会看到任何实例化。

在上面的例子中,成功的目标是 X=1,下一个目标是查询结束的伪目标。从变量的属性值中读取的唤醒目标被推送到列表中,以便它们可用于下一个目标。

让我们看看这个列表是否是一个 FIFO:

SWI-序言:

?- freeze(X, write('ha ')), freeze(X, write('tschi ')), X=1, nl.
ha tschi
X = 1.

?- freeze(X, write('ha ')), freeze(X, write('tschi ')), (X=1; X=2), nl.
ha tschi
X = 1 ;
ha tschi
X = 2.

带有 Minlog 扩展的 Jekejeke Prolog:
?- use_module(library(term/suspend)).
% 5 consults and 0 unloads in 90 ms.
Yes

?- freeze(X, write('ha ')), freeze(X, write('tschi ')), X=1, nl.
ha tschi
X = 1

?- freeze(X, write('ha ')), freeze(X, write('tschi ')), (X=1; X=2), nl.
ha tschi
X = 1 ;
ha tschi
X = 2

所以这个列表是一个FIFO。如此冰冷并立即醒来,
在上述两个 Prolog 系统中从左到右执行。从这一点也可以推断如果目标进一步卡住并立即自行唤醒会发生什么。

关于concurrency - Prolog 延迟评估 : LIFO or FIFO wake-up?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35120332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com