Proposisi (P -> Q) -> Q
dan P \/ Q
setara.
Apakah ada cara untuk menyaksikan kesetaraan ini di Haskell:
from :: Either a b -> ((a -> b) -> b)
from x = case x of
Left a -> \f -> f a
Right b -> \f -> b
to :: ((a -> b) -> b) -> Either a b
to = ???
seperti yang
from . to = id
dan to . from = id
?
((a -> b) -> b)
yang penuh isomorfik untuka
: satu-satunya implementasi yang mungkin adalahg f = f someHardcodedA
.g = const someHardcodedB
a
ataub
. Masuk akal.to f = callcc (\k -> k (Right (f (\a -> k (Left a)))))
akan berhasil. (Ini adalah bukti klasik dari implikasinya.)Jawaban:
Ini benar dalam logika klasik, tetapi tidak dalam logika konstruktif.
Dalam logika konstruktif kita tidak memiliki hukum perantara yang dikecualikan , yaitu kita tidak dapat memulai pemikiran kita dengan "P benar atau P tidak benar".
Secara klasik kami beralasan seperti:
x :: P
)) maka kembaliLeft x
.nx :: P -> Void
fungsi. Kemudianabsurd . nx :: P -> Q
(kita dapat memuncak jenis apa pun, kita ambilQ
) dan memanggil diberikanf :: (P -> Q) -> Q)
denganabsurd . nx
untuk mendapatkan nilai jenisQ
.Masalahnya, bahwa tidak ada fungsi umum dari suatu tipe:
Untuk beberapa jenis konkret ada, misalnya
Bool
dihuni sehingga kita bisa menulistetapi sekali lagi, secara umum kita tidak bisa.
sumber
Tidak, itu tidak mungkin. Pertimbangkan kasus khusus di mana
Q = Void
.Either P Q
kemudianEither P Void
, yang isomorfik untukP
.Karenanya, jika kita memiliki istilah fungsi
kita juga bisa memiliki istilah
Menurut korespondensi Curry-Howard, ini akan menjadi tautologi dalam logika intuitionistic :
Tetapi hal di atas adalah penghapusan negasi ganda, yang diketahui mustahil untuk dibuktikan dalam logika intuitionistic - karenanya merupakan kontradiksi. (Fakta bahwa kita dapat membuktikannya dalam logika klasik tidak relevan.)
(Catatan akhir: ini mengasumsikan bahwa keluar dari program Haskell berakhir. Tentu saja, menggunakan rekursi tak terbatas
undefined
,, dan cara-cara serupa untuk benar-benar menghindari untuk mengembalikan hasil, kita dapat menghuni jenis apa pun di Haskell.)sumber
Tidak, itu tidak mungkin, tapi agak halus. Masalahnya adalah bahwa variabel tipe
a
danb
secara universal dikuantifikasi.a
danb
secara universal diukur. Penelepon memilih jenis apa mereka, sehingga Anda tidak bisa hanya membuat nilai dari kedua jenis itu. Ini menyiratkan Anda tidak bisa hanya membuat nilai tipeEither a b
saat mengabaikan argumenf
. Tetapi menggunakanf
juga tidak mungkin. Tanpa mengetahui tipea
danb
apa, Anda tidak bisa membuat nilai tipea -> b
untuk diteruskanf
. Tidak ada cukup informasi yang tersedia ketika jenis-jenis tersebut dikuantifikasi secara universal.Sejauh mengapa isomorfisme tidak berfungsi di Haskell - apakah Anda yakin proposisi itu setara dalam logika intuitionist yang konstruktif? Haskell tidak menerapkan logika deduktif klasik.
sumber
Seperti yang telah ditunjukkan orang lain, ini tidak mungkin karena kita tidak memiliki hukum dari perantara yang dikecualikan. Biarkan saya membahasnya sedikit lebih eksplisit. Misalkan kita punya
dan kami mengatur
b ~ Void
. Lalu kita dapatkanSekarang, mari kita buktikan negasi ganda hukum tengah yang dikecualikan sebagaimana diterapkan pada proposisi tertentu .
Jadi sekarang
lem
jelas tidak bisa ada karenaa
dapat menyandikan proposisi bahwa konfigurasi mesin Turing yang kebetulan saya pilih akan berhenti.Mari kita verifikasi bahwa itu
lem
sudah cukup:sumber
Saya tidak tahu apa ini valid dalam hal logika, atau apa artinya untuk kesetaraan Anda, tapi ya mungkin untuk menulis fungsi seperti itu di Haskell.
Untuk membangun sebuah
Either a b
, kita membutuhkan suatua
ataub
nilai. Kami tidak memiliki cara untuk membanguna
nilai, tetapi kami memiliki fungsi yang mengembalikan nilaib
yang bisa kami panggil. Untuk melakukan itu, kita perlu menyediakan fungsi yang mengubah suatua
menjadib
, tetapi mengingat jenis tidak diketahui kita bisa membuat fungsi yang mengembalikan konstantab
. Untuk mendapatkanb
nilai itu, kita tidak bisa membangunnya dengan cara lain dari sebelumnya, jadi ini menjadi alasan melingkar - dan kita bisa menyelesaikannya dengan hanya membuat fixpoint :sumber