簡體   English   中英

Haskell中的庫里悖論?

[英]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 -> Voidx':: X ,所以我們可以通過 function 應用程序推導出Void

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM