Secara informal, ketika dua struktur matematika A,B
mempunyai dua fungsi "bagus" from,to
memuaskan from . to == id
dan to . from == id
, maka struktur A,B
dikatakan isomorfik.
Definisi sebenarnya dari fungsi "bagus" bervariasi menurut jenis struktur yang ada (dan terkadang, definisi "bagus" yang berbeda menimbulkan pengertian isomorfisme yang berbeda).
Gagasan di balik struktur isomorfik adalah, secara kasar, mereka "bekerja" dengan cara yang persis sama. Misalnya, pertimbangkan struktur A yang dibuat oleh boolean True,False
dengan &&,||
sebagai operasi. Misalkan struktur B terbuat dari dua natural1,0
dengan min,max
sebagai operasi. Ini adalah struktur yang berbeda, namun memiliki aturan yang sama. Misalnya True && x == x
dan 1 `min` x == x
untuk semua x
. A dan B bersifat isomorfik: fungsi to
akan memetakan True
ke 1
, dan False
ke 0
, sedangkan from
akan melakukan pemetaan sebaliknya.
(Perhatikan bahwa meskipun kita dapat memetakan True
ke 0
dan False
ke 1
, dan kita masih akan mendapatkan from . to == id
dan rangkapnya, pemetaan ini tidak akan dianggap "bagus" karena tidak akan mempertahankan strukturnya: misalnya, to (True && x) == to x
namun to (True && x) == to True `min` to x == 0 `min` to x == 0
.)
Contoh lain dalam situasi berbeda: anggap A sebagai lingkaran pada bidang tersebut, sedangkan B adalah persegi pada bidang tersebut. Kemudian seseorang dapat mendefinisikan pemetaan kontinu to,from
di antara pemetaan tersebut. Hal ini dapat dilakukan dengan dua "loop tertutup", secara longgar, yang dapat dikatakan isomorfik. Sebaliknya lingkaran dan bentuk "delapan" tidak dapat melakukan pemetaan kontinu seperti itu: titik yang berpotongan sendiri dalam "delapan" tidak dapat dipetakan ke titik mana pun dalam lingkaran secara terus menerus (kira-kira, empat "jalan" berangkat darinya , sedangkan titik-titik dalam lingkaran hanya memiliki dua "jalan" seperti itu.
Di Haskell, tipe juga dikatakan isomorfik ketika ada dua fungsi yang dapat ditentukan Haskell from,to
di antara keduanya yang memenuhi aturan di atas. Di sini menjadi fungsi yang "bagus" berarti dapat didefinisikan di Haskell. blog web yang tertaut a> menunjukkan beberapa tipe isomorfik tersebut. Berikut contoh lainnya, menggunakan tipe rekursif:
List1 a = Add Unit (Mul a (List1 a))
List2 a = Add Unit (Add a (Mul a (Mul a (List2 a))))
Secara intuitif, yang pertama dibaca sebagai: "daftar adalah daftar kosong, atau pasangan yang terbuat dari elemen dan daftar". Yang kedua dibaca sebagai: "daftar adalah daftar kosong, atau elemen tunggal, atau gabungan tiga elemen, elemen lain, dan daftar". Seseorang dapat mengkonversi keduanya dengan menangani elemen dua sekaligus.
Contoh lain:
Tree a = Add Unit (Mul a (Mul (Tree a) (Tree a)))
Anda dapat membuktikan bahwa tipe Tree Unit
isomorfik terhadap List1 (Tree Unit)
dengan memanfaatkan hukum aljabar yang ada di blog. Di bawah, =
adalah singkatan dari isomorfisme.
List1 (Tree Unit)
-- definition of List1 a
= Add Unit (Mul (Tree Unit) (List1 (Tree Unit)))
-- by inductive hypothesis, the inner `List1 (Tree Unit)` is isomorphic to `Tree Unit`
= Add Unit (Mul (Tree Unit) (Tree Unit))
-- definition of Tree a
= Tree Unit
Sketsa bukti di atas menginduksi fungsi to
sebagai berikut.
data Add a b = InL a | InR b
data Mul a b = P a b
type Unit = ()
newtype List1 a = List1 (Add Unit (Mul a (List1 a)))
newtype Tree a = Tree (Add Unit (Mul a (Mul (Tree a) (Tree a))))
to :: List1 (Tree Unit) -> Tree Unit
to (List1 (InL ())) = Tree (InL ())
to (List1 (InR (P t ts))) = Tree (InR (P () (P t (to ts))))
Perhatikan bagaimana pemanggilan rekursif memainkan peran hipotesis induktif dalam pembuktiannya.
Penulisan from
dibiarkan sebagai latihan :-P
person
chi
schedule
03.08.2014