假设存在一个实现停止问题的Haskel函数:
halt :: Integer->Bool
如果定义了x,则求值为True,否则求值为False。
假设我们在Haskell中将此函数调用为另一个函数
fHalt x = halt (x+1)
我想知道在这种情况下会发生什么,以及fHalt是单调的。我可能会得到2个答案:
Haskell对预定义的运算符使用严格评估 - 即对(+)也使用严格评估。如果现在用BOT评估fHalt,我的猜测是必须首先评估BOT + 1(导致BOT),因此整体评估不会终止并导致BOT。
如果Haskell以某种方式确定内部(x + 1)没有终止(由于停止问题而不可能),结果将为False,fHalt将违反单调性。
此时,我很恼火,因为我的问题已经暗示了Haskell中定义的不可实现的暂停函数。虽然我认为答案是正确的。
答案 0 :(得分:6)
问题的预设当然是错误的。
但我们至少应该确定
fHalt undefined = halt (undefined + 1)
只是因为我们希望beta法律毫无例外地持有。
现在,如果存在这个假设的halt
,它应该能够检测到
undefined + 1 = undefined
不应该吗?当然,它不会出现 Haskell ,而是halt
函数中的魔力。
答案 1 :(得分:0)
Haskell对预定义的运算符使用严格评估 - 即也用于(+)。
不,不是一般的。但是,专门针对+
Integer
上的halt
实施 严格且您的进一步推理工作(当然,因为它是从{{1}}存在的错误前提开始的,它不太有用。)