簡體   English   中英

阿格達(Ada)的停工問題?

[英]HaltingProblem in Agda?

我正在研究試圖在Agda中實現其Haskell代碼的論文。 他們想通過說bot是一個程序來表示暫停問題,這樣對於任何數據類型a

bot :: a
bot = bot

他們繼續定義

data S = T

因此,停機問題可以說是:

函數diverges : S → S定義為

diverges(T)= bot
diverges(bot)= T

不可計算,因此無法用我們的語言定義

我試着在Agda中實現為:

data S : Set where
  ⊤ : S

⊥ : _
⊥ = ⊥

diverges : S → S
diverges ⊤ = ⊥
diverges ⊥ = ⊤

當我嘗試加載它時,Agda說said diverges ⊥ = ⊤是不可達子句。 這是我應該得到的錯誤,還是我只是錯誤地實現了Haskell代碼?

您的項目可能無法正常工作,因為Agda並非圖靈完備的語言。 一方面,它只允許全部功能,因此它無法對任何可能無法停止的計算進行建模。 這意味着它甚至無法在圖靈機上對完整的計算建模,例如,因為圖靈機可能無法停止。 因此,本文中的所有程序都不太可能在Agda中實現。

實際上,甚至不可能通過簡單的對角線參數在Agda中編寫所有的總計算量。 想象一下以下算法:“檢查文本文件並確定其是否合法。如果不是,則輸出空字符串;如果是,則在相同的文本文件上運行該Agda程序,並在末尾添加一個空格。輸出。” 這是一個定義明確的算法; 大多數復雜性在於“確定是否合法的Agda”和“運行該Agda程序”,並且確實存在執行這些操作的程序。 但是Agda程序無法實現它,因為任何候選程序在其自己的源代碼上運行時都會給出不同的輸出。 任何總的語言都有類似的論點。

像這樣的繞一圈奇怪的論點是理解“停止問題”的核心,因此您正在閱讀的論文可能會包含其中的許多內容。

順便說一下,在Haskell中無法定義函數diverges Haskell中的可計算函數必須為更多定義的輸入提供更多定義的輸出,並且⊤被認為比more更定義(這是實際值,與“ this is undefined”的符號相反)。

暫無
暫無

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

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