4.3 Variations on a Scheme: Nondeterministic Computing-笔记

非确定性计算(Nodeterministic Computing) 能够对不同的可能性进行探索,得出符合条件的其中一种结果,除此之外,非确定性计算还可以对选择点(进行可能性选择的节点)进行回溯,对新的可能性进行探索。虽然每次非确定性计算只能得到一种可能性结果,但不断使用回溯操作便会产生新的可能性结果,直到所有可能性穷尽为止。

要实现非确定性求值器需要通过 amb 特殊形式,所以非确定性编程语言的求值器称为 amb 求值器。amb 的语法为 (amb ... ),返回结果为 n 个表达式中的任意一个。如果 amb 中如果没有任何选择(也就是没有传递任何表达式作为参数)它就是一个没有可访问值的表达式。在 amb 求值器中通常可以通过没有任何表达式的 amb 表达式 ((amb))表示可能性探索的失败(也就是可能性穷尽)。

在之前的求值器中,计算一个表达式的结果需要表达式和对应的计算环境,而在 amb 求值器,除了表达式和对应的计算环境之外,还需要提供两个延续程式,一个为成功延续程式,另一个为失败延续程式。当表达式计算成功时,会将表达式计算结果和失败延续程式通过成功延续程式继续向下传导,如果出现失败情况(选择点的可能性穷尽或当前选择路径中不符合预期条件)则会通过失败延续程式传导。失败延续程式传导的结果一般会有两种情况,一种情况是回到前一选择点选取另一种未曾尝试的可能性推进,或者回到顶级驱动循环中(所有的可能性都已经穷尽时)提示操作人员没有更多的可能性进行尝试。

amb 求值器与惰性求值器最大不同在于,惰性求值器通过将元素组合的时间和计算具体元素的时间解耦,制造了一个当前列表或流中已经完成所有元素计算的假象。而 amb 求值器如同将时间分解成了多个时间分支,每个时间分支表示不同的可能性,并且时间分支可以进行回溯操作。

你可能感兴趣的:(4.3 Variations on a Scheme: Nondeterministic Computing-笔记)