在Haskell中关于停止概率的非严格评估

时间:2014-08-13 07:18:24

标签: haskell halting-problem monotone

假设存在一个实现停止问题的Haskel函数:

halt :: Integer->Bool

如果定义了x,则求值为True,否则求值为False。

假设我们在Haskell中将此函数调用为另一个函数

fHalt x = halt (x+1)

我想知道在这种情况下会发生什么,以及fHalt是单调的。我可能会得到2个答案:

  1. Haskell对预定义的运算符使用严格评估 - 即对(+)也使用严格评估。如果现在用BOT评估fHalt,我的猜测是必须首先评估BOT + 1(导致BOT),因此整体评估不会终止并导致BOT。

  2. 如果Haskell以某种方式确定内部(x + 1)没有终止(由于停止问题而不可能),结果将为False,fHalt将违反单调性。

  3. 此时,我很恼火,因为我的问题已经暗示了Haskell中定义的不可实现的暂停函数。虽然我认为答案是正确的。

2 个答案:

答案 0 :(得分:6)

问题的预设当然是错误的。

但我们至少应该确定

fHalt undefined = halt (undefined + 1)

只是因为我们希望beta法律毫无例外地持有。

现在,如果存在这个假设的halt,它应该能够检测到

undefined + 1 = undefined
不应该吗?当然,它不会出现 Haskell ,而是halt函数中的魔力。

答案 1 :(得分:0)

  

Haskell对预定义的运算符使用严格评估 - 即也用于(+)。

不,不是一般的。但是,专门针对+ Integer上的halt实施 严格且您的进一步推理工作(当然,因为它是从{{1}}存在的错误前提开始的,它不太有用。)