当我的朋友在学校开始学习 Prolog 时,我嘲笑他学习了一门无用的语言。然而,他向我展示了一些我从来不知道可能发生的东西;我想知道这个技术从何而来。
技术是这样的:
permutation(List) :-
isAMember(X, List),
deleteFirstElement(X, List, Substring),
% and so on
在这段代码中,isAMember(X, List)
是一个函数,如果X
is in List
。然而,到目前为止X
未定义为变量 -因此程序将产生一堆新线程,一个线程对应每个可能的值X
这使得isAMember(X, List)
true,并从那里继续。
这使我们能够以我能想象到的最简单、最优雅的方式创建多线程算法。
所以我的问题是:这是 Prolog 特有的,还是所有逻辑和/或函数语言的特性?另外,我在哪里可以学到更多像这样令人惊叹的多线程技术——这肯定是编程的未来。
Prolog 的子集称为“Datalog”,仅限于纯逻辑特征(无“剪切”),原则上,证明搜索可以并行完成。但是,您必须小心,因为完整 Prolog 的语义对结果生成的顺序非常敏感,并且一些真正的 Prolog 程序依赖于此。
Haskell 和 Clean 等纯函数语言的情况要好一些——并行计算子表达式总是安全的——但性能方面存在许多挑战。如果您执行极端并行性(每个子表达式),则由于所有开销,您不会获得任何性能提升。目前有希望的方法似乎是
线程(并发 Haskell)
数据并行 Haskell
“火花”与par
and seq
运营商。
并行函数已经存在了近 30 年,人们仍在努力使其表现良好。如果您想了解更多信息,请尝试
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)