簡體   English   中英

多線程...函數式語言? (序言)

[英]Multithreading in… functional languages? (Prolog)

當我的朋友開始在學校學習Prolog時,我取笑他學習一種無用的語言。 然而,他向我展示了一些我從未知道的東西; 我想知道這種技術的來源。

技術是這樣的:

permutation(List) :-
    isAMember(X, List),
    deleteFirstElement(X, List, Substring),
    % and so on

在此代碼中, isAMember(X, List)是一個函數,如果XList ,則返回true。 但是,到目前為止, X並未定義為變量 - 因此程序將生成一堆新線程,每個可能的X值使得isAMember(X, List) true,並從那里繼續。

這使我們能夠以我能想象到的最簡單,最優雅的方式創建多線程算法。

所以我的問題是: 這是Prolog特定的,還是所有邏輯和/或功能語言的特征? 另外,我在哪里可以學到更多這樣令人驚嘆的多線程技術 - 這無疑是編程的未來。

被稱為“數據記錄”的Prolog子集僅限於純邏輯特征(沒有“切割”),並且原則上,證明搜索可以並行完成。 但是你必須要小心,因為完整Prolog的語義對結果的生成順序非常敏感,而一些真正的Prolog程序依賴於此。

像Haskell和Clean這樣的純函數式語言的情況要好一些 - 並行地評估子表達式總是安全的 - 但是性能存在很多挑戰。 如果你進行極端並行(每個子表達式),由於所有開銷,你不會獲得任何性能提升。 目前有希望的方法似乎是

  • 線程(並發Haskell)

  • 數據並行Haskell

  • 使用parseq運算符“Sparks”。

並行功能已經存在了近30年,人們仍在努力使其表現良好。 如果您想了解更多信息,請嘗試

  • 最近關於Haskell的ACM研討會的會議記錄(以及之前的Haskell研討會)

  • 麻省理工學院的Arvind的工作,他是這個領域的偉大先驅(查看他與R. Nikhil關於pH並行編程的書)

如果我正確地記住了我的Prolog,你就不是在創建線程,而是使用回溯和統一依次嘗試每個可能的X實例化。 這是相當連續的。

編輯:顯然有一些實驗性的並行序言,例如,改革Prolog。 但是,據我所知,這不是Prolog實現的常態。

isAMember(X, List)不會創建線程,prolog邏輯只是依賴於遞歸和回溯,並且除非你明確地創建線程,否則它是非常程序化的。

isAMember(X, List)的情況下,您正在查看統一概念。 該函數將與計算該函數的所有值統一為true,在本例中為列表中包含的所有元素。 然后繼續執行X.

一旦執行到達一個葉子,它將回溯到盡可能早的“仍然可以統一”的調用(或者切點,我認為,不能記住正確的術語),比如isAMember(X, List) ,將統一X到下一個候選人,並恢復執行。

我敢說,如果你在邏輯上不小心,你可以輕松地獲得堆棧溢出。

老實說,你所展示的內容似乎與列表理解沒有任何不同,可能與foreach相結合:

foreach {x | x in List}
    deleteFirstElement(x, List, Substring) 
    // not sure what deleteFirstElement does, so...

正如你所提到的,可能是任何事情,列表理解也可能更復雜

foreach {x | x in List if x % 2 == 0} // ie, even elements of List

同樣,你可以在沒有列表理解的情況下做同樣的事情

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

這可以很簡單地分解成線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM