我熟悉选择运算符((?)
)的作用,它需要两个参数并匹配它们。我们可以将其定义如下:
a?_=a
_?b=b
这可用于在两个值之间引入非确定性。然而,我不明白为什么我们想这样做。
使用(?)
可以解决问题的示例是什么?
答案 0 :(得分:3)
通常用于激发非决定论的一个例子是计算列表的所有排列的函数。
insert e [] = [e]
insert e (x:xs) = (e : x : xs) ? (x : insert e xs)
perm [] = []
perm (x:xs) = insert x (perm xs)
这里的好处是你不需要指定你想要枚举所有列表的方式,像Curry这样的逻辑编程语言的基础搜索算法(默认情况下,它是深度优先搜索)为你完成工作。您只需说明结果中的列表应如何显示。
希望您在以下文章中找到一些更现实的例子。
New Functional Logic Design Patterns
Functional Logic Design Patterns
修改:我最近发布了有关该主题的工作,我想添加application of probabilistic programming。在本文中,我们表明,使用非确定性来模拟概率值可以在基于列表的方法中有关于修剪搜索空间的优势。更准确地说,当我们对概率值执行查询,即基于谓词过滤分布时,非确定性的行为不如基于列表的方法严格,并且可以修剪搜索空间。