簡體   English   中英

是否有可能有效地評估lambda演算術語?

[英]Is it possible to evaluate lambda calculus terms efficiently?

我最近在lambda演算中編寫了很多程序,我希望我可以實時運行其中一些程序。 然而,盡管趨勢功能范例基於lambda演算和B減少規則,但我找不到一個不是玩具的單一評估者,而不是效率。 功能語言應該很快,但我知道的那些實際上並不提供對普通表單的訪問(參見Haskell的惰性求值程序,Scheme的閉包等),因此不能用作LC求值程序。

這讓我想知道:只是不可能有效地評估lambda演算術語,它只是一個歷史事故/缺乏興趣,沒有人決定為它創建一個快速評估者,或者我只是缺少一些東西?

在目前的知識狀態下,評估λ項的最佳方法是所謂的最優圖減少技術。 該技術於1989年由J.Lamping在他的POPL文章“ 最佳lambda演算減少算法 ”中引入,然后由幾位作者進行修訂和改進。 您可以在我的書中找到S.Guerrini“ 函數式編程語言的最佳實現 ”,劍橋理論計算機科學雜志,第44頁,1998年。

“最優”一詞指的是共享管理。 在lambda演算中,你有很多重復,減少的效率至關重要地基於復制工作。 在第一順序設置中,有向非循環圖(dags)足以管理共享,但只要您輸入更高階設置,您就需要更復雜的圖形結構,包括共享和取消共享。

在純lambda術語中,最優圖減少比所有其他已知的減少技術(環境機器,超級組合器或其他)更快。 上面的書中給出了一些基准(參見第296-301頁),我們證明了我們的實現優於caml-light(ocaml的前身)和Haskell(非常慢)。 所以,如果你聽到人們說從未證明最佳減少比其他技術更快,那就不是真的:它在理論和實驗上得到了證明。

函數式語言尚未以這種方式實現的原因是在函數式編程的實踐中,你很少使用具有非常高級別的函數,並且當你這樣做時它們通常是線性的。 一旦提高等級,lambda術語的內在復雜性就會變得非常危險。 有一種技術可以讓你減少一個時間段O(2 ^ n)而不是O(2 ^(2 ^ n))並沒有在實踐中產生那么大的差別:兩種計算都是不可行的。

我最近寫了一篇簡短的文章,試圖解釋這些問題:“ 關於有效減少lambda術語 ”。 在同一篇文章中,我還討論了采用超優化還原技術的可能性。

評估lambda術語有多種方法。 根據類型信息是否可用,您可以獲得更高效和更安全的評估程序(不需要運行時檢查,因為已知程序運行良好)。 我將簡要介紹一些技巧。

大步評估員

您可以設計一種算法,試圖通過在“大步驟”中評估術語來最小化工作,而不是重復定位lambda-redex並觸發它們(這意味着多次遍歷該術語)。

例如,如果要標准化的術語是tu那么你將tu標准化,如果norm t是lambda抽象,則觸發相應的redex並重新啟動你剛剛得到的術語的標准化。

抽象/虛擬機

現在,您可以使用抽象機器完成相同的工作但速度更快。 這些小型虛擬機具有自己的一組指令和簡化規則,您可以用自己喜歡的語言實現這些規則並將lambda術語編譯為。

歷史的例子是SECD機器

Danvy等。 已經表明,眾所周知的抽象機器可以通過連續傳遞風格和去功能化的組合從前面提到的評估者中得出。

要從抽象機器中獲取一個lambda-term,你需要實現一個基於機器所處狀態構建lambda術語的reification / readback函數.Grégoire和Leroy展示了如何在一個上下文中完成這樣的事情。該語言的類型理論是Coq。

通過評估進行標准化

通過評估規范化是利用宿主語言的評估機制來實現另一種語言的規范化過程的實踐。

Lambda抽象被轉換為宿主語言中的函數 ,應用程序成為宿主語言的應用程序等等。

這種技術可以以類型化的方式使用(例如, 在HaskellOCaml中對簡單類型的lambda演算進行歸一化)或無類型的(例如,簡單類型的lambda演算再次Coq術語編譯為OCaml(!)) 。

暫無
暫無

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

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