[英]Curry's paradox in Haskell?
Curry 悖論(以與目前的編程語言相同的人命名)是一種可能在錯誤邏輯中的構造,它允許人們證明任何事情。
我對邏輯一無所知,但它有多難?
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
或遞歸的情況下做同樣的事情嗎? 為什么?庫里悖論的編碼看起來更像這樣:
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
是假設時新類型構造函數上的模式匹配,或者當X
是目標時應用構造函數(事實上,正如我們上面做了):
x :: X
x = X (\x'@(X f) -> _)
最后,我們現在有了f:: X -> Void
和x':: X
,所以我們可以通過 function 應用程序推導出Void
:
x :: X
x = X (\x'@(X f) -> f x')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.