Search Haskell中的搜索控制

Search Haskell中的搜索控制,search,haskell,lazy-evaluation,inference,Search,Haskell,Lazy Evaluation,Inference,假设您正在编写一个搜索指数级大或无限空间的程序:游戏、定理证明、优化等,任何您无法搜索整个空间的内容,结果的质量在很大程度上取决于在可用资源中选择要搜索的部分 在eager语言中,这在概念上很简单:该语言允许您指定求值顺序,并使用该顺序控制搜索空间的哪些部分首先求值。(在实践中,它往往变得混乱和复杂,因为推理控制的代码布局与问题定义混合在一起,这也是我对用惰性语言实现这一点感兴趣的原因之一。但它在概念上很简单。) 用Haskell这种懒惰的语言,你不能那样做。我可以想出两种方法: 编写的代码取决

假设您正在编写一个搜索指数级大或无限空间的程序:游戏、定理证明、优化等,任何您无法搜索整个空间的内容,结果的质量在很大程度上取决于在可用资源中选择要搜索的部分

在eager语言中,这在概念上很简单:该语言允许您指定求值顺序,并使用该顺序控制搜索空间的哪些部分首先求值。(在实践中,它往往变得混乱和复杂,因为推理控制的代码布局与问题定义混合在一起,这也是我对用惰性语言实现这一点感兴趣的原因之一。但它在概念上很简单。)

用Haskell这种懒惰的语言,你不能那样做。我可以想出两种方法:

  • 编写的代码取决于您正在使用的编译器的当前版本选择的精确计算顺序,以及您正在使用的优化标志,以便最终以正确的顺序进行操作。这似乎会导致可维护性问题

  • 编写编写代码的代码,特别是编写将问题定义与一组启发式方法一起转换为一系列指令的代码,这些指令以一种急切的语言表示,指定了执行操作的确切顺序。如果你愿意支付前期费用,这似乎是有好处的


  • 还有其他推荐的方法来完成这类工作吗?

    您可以将haskell代码的一部分建立在严格评估的基础上


    在惰性语言中执行此操作的典型方法是将搜索空间定义为(可能是无限的)数据结构,然后编写您希望用于单独遍历此结构的任何策略。这样,您就可以控制所使用的策略,但它与问题定义是分开的。

    好的,第一部分我想我可以看到如何做,但是如何编写策略以特定顺序遍历结构?例如,假设结构是一个游戏树。然后递归遍历它,并在每一步使用一些启发式方法来确定是继续向下遍历这个子树还是放弃它。对,但在那个阶段,继续向下不是意味着求值(从某种意义上说,语言意味着逐求值)?这是否会让您回到编写依赖于语言对何时进行求值做出的确切决定的代码?在Haskell中,您通过依赖关系控制求值顺序。如果函数的结果取决于子表达式的结果,则无论何时需要计算函数的结果,都将计算子表达式。因此,您的计算顺序并不取决于编译器版本;它被指定为语言的一部分。@rwallace:假设您有一个游戏树,每个节点都是一个游戏状态,每个节点都有分支用于从该状态开始的每个可能的移动。在给定的节点上,您可以应用一种启发式方法来决定该分支是否值得进一步检查。如果不是,则返回一个空结果。如果是,则对其子节点执行相同的操作,然后从这些节点中获取最佳结果。这样做只会评估启发式算法认为有价值的游戏树部分。如果你提供了一个具体的例子,你可能会得到更深刻的答案。你可能会有兴趣看看。也,