Haskell中Curry的悖论?

时间:2019-10-12 08:18:56

标签: haskell recursion logic paradox curry-howard

Curry's paradox (以与当前编程语言相同的人的名字命名)是一种错误的逻辑结构,它可以使人证明一切。

我对逻辑一无所知,但是有多难?

module Main where

import Data.Void
import Data.Function

data X = X (X -> Void)

x :: X
x = fix \(X f) -> X f

u :: Void
u = let (X f) = x in f x

main :: IO ()
main = u `seq` print "Done!"

它肯定会循环。 (GHC怎么知道?!)

% ghc -XBlockArguments Z.hs && ./Z
[1 of 1] Compiling Main             ( Z.hs, Z.o )
Linking Z ...
Z: <<loop>>

  • 这是忠实的翻译吗?为什么?
  • 是否可以在没有fix或递归的情况下执行相同的操作?为什么?

1 个答案:

答案 0 :(得分:4)

Curry悖论的编码看起来像这样:

x :: X
x = X (\x'@(X f) -> f x')

X的确可以理解为句子“如果X为真,则存在矛盾”,或等效地为“ X为假”。

但是使用fix来证明X并没有什么实际意义,因为fix作为推理原理是公然不正确的。咖喱的悖论更加微妙。

您如何实际证明X

x :: X
x = _

X是一个条件命题,因此您可以从假定其前提以表明其结论开始。此逻辑步骤对应于插入lambda。 (建设性地,蕴涵的证明是从前提的证明到结论的证明的映射。)

x :: X
x = X (\x' -> _)

但是现在有了一个假设x' :: X,我们可以再次展开X的定义以获得f :: X -> Void。在Curry悖论的非正式描述中,没有明确的“展开步骤”,但是在Haskell中,当X是假设时,它对应于newtype构造函数上的模式匹配,而当X是目标(实际上,就像我们上面所做的那样):

x :: X
x = X (\x'@(X f) -> _)

最后,我们现在有f :: X -> Voidx' :: X,因此我们可以通过函数应用程序推论Void

x :: X
x = X (\x'@(X f) -> f x')