繁体   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