Multithreading 多线程在。。。函数语言?(序言)

Multithreading 多线程在。。。函数语言?(序言),multithreading,functional-programming,prolog,logic-programming,Multithreading,Functional Programming,Prolog,Logic Programming,当我的朋友在学校开始学序言时,我取笑他学了一门无用的语言。然而,他向我展示了一些我甚至不知道可能发生的事情;我想知道这项技术是从哪里来的 技术是这样的: permutation(List) :- isAMember(X, List), deleteFirstElement(X, List, Substring), % and so on 在此代码中,isAMember(X,List)是一个函数,如果X位于List中,则该函数返回true。但是,到目前为止,X还没有定义为

当我的朋友在学校开始学序言时,我取笑他学了一门无用的语言。然而,他向我展示了一些我甚至不知道可能发生的事情;我想知道这项技术是从哪里来的

技术是这样的:

permutation(List) :-
    isAMember(X, List),
    deleteFirstElement(X, List, Substring),
    % and so on
在此代码中,
isAMember(X,List)
是一个函数,如果
X
位于
List
中,则该函数返回true。但是,到目前为止,
X
还没有定义为变量-因此程序将产生一组新线程,每个
X
的可能值对应一个线程,使
isamber(X,List)
为真,并从那里继续

这使我们能够以我所能想象到的最简单、最优雅的方式创建多线程算法


因此,我的问题是:这是特定于Prolog的,还是所有逻辑和/或函数语言的一个功能?此外,我在哪里可以学习到像这样更令人惊奇的多线程技术?这肯定是编程的未来。

如果我正确地记住了我的Prolog,你就不会创建线程,但是,使用回溯和统一,依次尝试X的每个可能的实例化。它相当连续

编辑:显然有一些实验性的并行序言,例如,改革序言。然而,据我所知,这不是Prolog实现中的标准

isAMember(X,List)
不会创建线程,prolog逻辑严重依赖于递归和回溯,并且非常程序化,除非您显式创建线程

在isAMember(X,List)的例子中,您看到的是统一概念。该函数将与对该函数求值为true的所有值(在本例中为列表中包含的所有元素)统一。然后用X继续执行

一旦执行到达一个叶子,它将返回到最早可能的“仍然可统一”调用(或切点,我想,我记不起正确的术语),比如说
isAMember(X,List)
,将X统一到下一个候选,然后继续执行


我敢说,如果你在逻辑上不小心,你很容易就会出现堆栈溢出。

Prolog的子集被称为“Datalog”,仅限于纯逻辑特性(无“cut”),原则上,验证搜索可以并行进行。但是,您必须小心,因为完整Prolog的语义对结果的生成顺序非常敏感,一些真正的Prolog程序依赖于此

在Haskell和Clean这样的纯函数式语言中,情况要好一点,并行计算子表达式总是安全的,但在性能方面存在许多挑战。如果执行极端并行(每个子表达式),由于所有开销,您不会获得任何性能提升。目前有希望的方法似乎是

  • 线程(并发Haskell)

  • 数据并行Haskell

  • 使用
    par
    seq
    运算符“火花”

平行功能的东西已经存在了近30年,人们仍在努力使它表现良好。如果您想了解更多信息,请尝试

  • 关于Haskell的ACM研讨会近期会议记录(在此之前,Haskell研讨会)

  • 麻省理工学院的Arvind是这一领域的伟大先驱(请参阅他与R.Nikhil合著的关于与pH并行编程的书)


老实说,您所展示的内容似乎与列表理解没有任何区别,可能与foreach结合在一起:

foreach {x | x in List}
    deleteFirstElement(x, List, Substring) 
    // not sure what deleteFirstElement does, so...
正如你提到的,isAMember可以是任何东西,列表理解也可能更复杂

foreach {x | x in List if x % 2 == 0} // ie, even elements of List
按照同样的思路,你可以做同样的事情,而不需要理解列表

new_list = old_list.every { x | x % 2 == 0 }

可以很容易地将其分解为线程。

我想说编程就是这样开始的!非确定性图灵机有这个概念。Prolog不是一个函数式图灵机。它专门解决逻辑问题。这是特定于实现的。逻辑编程很容易分成线程,因为它不像面向对象/过程编程那样依赖于全局状态。是的,你是对的,还有一些是并行的。更新了我的答案。这个“回溯”听起来非常像“模拟多线程”——这是语言的核心部分,还是最流行的Prolog实现?变量统一回溯是Prolog编程的核心。