multithreading - 非确定性编程语言

标签 multithreading functional-programming prolog non-deterministic

我知道在 Prolog 中你可以做类似的事情

someFunction(List) :- 
    someOtherFunction(X, List)
    doSomethingWith(X)
    % and so on

这不会遍历 List 中的每个元素;相反,它将分支到不同的“机器”(通过使用多个线程,在单个线程上回溯,创建平行宇宙或你有什么),对导致 someOtherFunction(X, List) 的每个可能的 X 值单独执行返回真实!
(我不知道它是如何做到的,但这对问题并不重要)

我的问题是:还有哪些其他非确定性编程语言? 似乎非确定性是在具有不可变变量的语言中实现多线程的最简单、最合乎逻辑的方法,但我以前从未见过这样做过 - 为什么这种技术没有更受欢迎?

最佳答案

Prolog 实际上是确定性的——评估的顺序是规定的,顺序很重要。

Why isn't nondeterminism more popular?



非确定性不受欢迎,因为它使程序结果的推理变得更加困难,并且真正的非确定性执行(与语义相反)很难实现。

我所知道的唯一非确定性语言是
  • Dijkstra 的守卫命令演算,他不想实现
  • 并发 ML,其中通信可以不确定地同步
  • Gerard Holzmann 的 Promela 语言,这是模型检查器 SPIN 的语言

  • SPIN 确实使用了不确定性,并在可能的情况下探索了整个状态空间。

    当然,如果线程不同步,任何多线程语言的行为都是不确定的,但这正是难以推理的事情——以及为什么实现高效、正确的无锁数据结构如此困难。

    顺便说一句,如果您希望实现并行性,您可以通过一个简单的 map 来实现相同的目的。在像 Haskell 这样的纯函数式语言中使用函数。 Google MapReduce 基于函数式语言是有原因的。

    关于multithreading - 非确定性编程语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185277/

    相关文章:

    java - 在java中使用多线程调用同一类的不同方法

    java - 使多播套接字可从另一个线程访问

    android - 我应该使用线程还是服务在 Android 的后台运行任务?

    javascript - Ramda - 部分应用的功能取决于完整的应用

    module - 如何导入模块以在模块中使用(ocaml)

    c++ - 如何为 OpenMP 中的任意数量的线程并行化获得相同的输出以用于 if-else,增量?

    javascript - 为什么 Javascript 函数在实例化和执行时的行为不同?

    duplicates - 如何防止序言中出现重复

    Prolog 谓词提取给定单词列表中紧随某个单词之后的所有单词

    prolog - CLPB 的不良特性