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
或递归的情况下执行相同的操作?为什么?答案 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 -> Void
和x' :: X
,因此我们可以通过函数应用程序推论Void
:
x :: X
x = X (\x'@(X f) -> f x')