Saya bersumpah dulu ada T-shirt untuk dijual yang menampilkan kata-kata abadi:
Bagian dari apa
apakah kamu tidak mengerti
Dalam kasus saya, jawabannya adalah ... semuanya!
Secara khusus, saya sering melihat notasi seperti ini di surat kabar Haskell, tetapi saya tidak tahu apa artinya. Saya tidak tahu cabang matematika apa yang seharusnya.
Saya mengenali huruf-huruf alfabet Yunani, tentu saja, dan simbol-simbol seperti "∉" (yang biasanya berarti bahwa sesuatu bukanlah unsur suatu himpunan).
Di sisi lain, saya belum pernah melihat "⊢" sebelumnya ( Wikipedia mengklaim itu mungkin berarti "partisi" ). Saya juga tidak terbiasa dengan penggunaan vinculum di sini. (Biasanya, itu menandakan fraksi, tapi itu tidak muncul menjadi kasus di sini.)
Jika seseorang setidaknya bisa memberi tahu saya di mana harus mulai mencari untuk memahami apa arti lautan simbol ini, itu akan sangat membantu.
sumber
Jawaban:
:
berarti memiliki tipe∈
berarti dalam . (Demikian juga∉
berarti "tidak ada".)Γ
biasanya digunakan untuk merujuk pada lingkungan atau konteks; dalam hal ini dapat dianggap sebagai satu set anotasi jenis, memasangkan pengidentifikasi dengan tipenya. Karena itux : σ ∈ Γ
berarti lingkunganΓ
termasuk fakta yangx
bertipeσ
.⊢
dapat dibaca sebagai membuktikan atau menentukan.Γ ⊢ x : σ
berarti bahwa lingkunganΓ
menentukan yangx
memiliki tipeσ
.,
adalah cara memasukkan asumsi tambahan spesifik ke dalam suatu lingkunganΓ
.Oleh karena itu,
Γ, x : τ ⊢ e : τ'
berarti lingkungan ituΓ
, dengan asumsi tambahan, utama yangx
memiliki tipeτ
, membuktikan bahwae
memiliki tipeτ'
.Seperti yang diminta: prioritas operator, dari tertinggi ke terendah:
λ x . e
,∀ α . σ
, danτ → τ'
,let x = e0 in e1
, dan spasi untuk aplikasi fungsi.:
∈
dan∉
,
(asosiatif kiri)⊢
sumber
:
dan∈
sangat mirip, dalam arti mereka satu hal terkandung dalam hal lain - satu set berisi elemen, dan tipe berisi nilai, dalam arti tertentu. Perbedaan krusial adalah itux ∈ S
berarti bahwa suatu himpunanS
secara harfiah mengandung suatu unsurx
, sedangkanΓ ⊢ x : T
sarana yangx
dapat disimpulkan untuk menghuni tipeT
dalam konteksΓ
. Mempertimbangkan hal ini, aturan Var berbunyi: »Jika x secara harfiah terkandung dalam konteksnya, ia dapat (secara sepele) disimpulkan darinya«.(Γ,(x:τ))⊢(x:σ)
, melihat overleaf.com/read/ddmnkzjtnqbd#/61990222Sintaks ini, meskipun terlihat rumit, sebenarnya cukup sederhana. Ide dasar berasal dari logika formal: seluruh ekspresi adalah implikasi dengan bagian atas sebagai asumsi dan bagian bawah sebagai hasilnya. Yaitu, jika Anda tahu bahwa ekspresi atas adalah benar, Anda dapat menyimpulkan bahwa ekspresi bawah juga benar.
Simbol
Hal lain yang perlu diingat adalah bahwa beberapa surat memiliki makna tradisional; khususnya, Γ merepresentasikan "konteks" tempat Anda berada — yaitu, apa jenis hal-hal lain yang Anda lihat. Jadi sesuatu seperti
Γ ⊢ ...
berarti "ekspresi...
ketika Anda mengetahui tipe dari setiap ekspresi dalamΓ
.The
⊢
simbol dasarnya berarti bahwa Anda dapat membuktikan sesuatu. BegituΓ ⊢ ...
juga pernyataan yang mengatakan "Saya bisa membuktikan...
dalam konteksΓ
. Pernyataan ini juga disebut tipe penilaian.Hal lain yang perlu diingat: dalam matematika, sama seperti ML dan Scala,
x : σ
berarti yangx
memiliki tipeσ
. Anda dapat membacanya seperti milik Haskellx :: σ
.Apa arti setiap aturan
Jadi, mengetahui hal ini, ungkapan pertama menjadi mudah dipahami: jika kita tahu bahwa
x : σ ∈ Γ
(yaitu,x
memiliki beberapa tipeσ
dalam beberapa konteksΓ
), maka kita tahu bahwaΓ ⊢ x : σ
(yaitu, dalamΓ
,x
memiliki tipeσ
). Jadi sungguh, ini tidak memberi tahu Anda sesuatu yang super menarik; itu hanya memberi tahu Anda bagaimana menggunakan konteks Anda.Aturan lainnya juga sederhana. Sebagai contoh, ambil
[App]
. Aturan ini memiliki dua kondisi:e₀
adalah fungsi dari beberapa tipeτ
ke beberapa tipeτ'
dane₁
merupakan nilai tipeτ
. Sekarang Anda tahu apa jenis Anda akan mendapatkan dengan menerapkane₀
untuke₁
! Semoga ini bukan kejutan :).Aturan selanjutnya memiliki beberapa sintaks baru. Khususnya,
Γ, x : τ
adil artinya konteks terdiri dariΓ
dan penilaianx : τ
. Jadi, jika kita tahu bahwa variabelx
memiliki tipeτ
dan ekspresie
memiliki tipeτ'
, kita juga tahu tipe fungsi yang mengambilx
dan mengembalikane
. Ini hanya memberi tahu kita apa yang harus dilakukan jika kita sudah tahu jenis fungsi apa yang diperlukan dan tipe apa yang dikembalikan, jadi seharusnya tidak mengejutkan.Yang berikutnya hanya memberi tahu Anda cara menangani
let
pernyataan. Jika Anda tahu bahwa beberapa ekspresie₁
memiliki tipeτ
selamax
memiliki tipeσ
, makalet
ekspresi yang secara lokal mengikatx
nilai tipeσ
akan membuate₁
memiliki tipeτ
. Sungguh, ini hanya memberi tahu Anda bahwa pernyataan let pada dasarnya memungkinkan Anda memperluas konteks dengan pengikatan baru — yang persis sepertilet
itu!The
[Inst]
Aturan berhubungan dengan sub-mengetik. Itu mengatakan bahwa jika Anda memiliki nilai tipeσ'
dan itu adalah sub-tipeσ
(⊑
mewakili hubungan pemesanan parsial) maka ekspresi itu juga bertipeσ
.Aturan terakhir berkaitan dengan jenis generalisasi. Samping cepat: variabel bebas adalah variabel yang tidak diperkenalkan oleh pernyataan-let atau lambda di dalam beberapa ekspresi; ungkapan ini sekarang tergantung pada nilai variabel bebas dari konteksnya. Aturan mengatakan bahwa jika ada beberapa variabel
α
yang tidak "bebas" dalam apa pun dalam konteks Anda, maka aman untuk mengatakan bahwa setiap ekspresi yang jenisnya Anda ketahuie : σ
akan memiliki tipe itu untuk nilai apa pun dariα
.Cara menggunakan aturan
Jadi, sekarang Anda mengerti simbol, apa yang Anda lakukan dengan aturan ini? Nah, Anda bisa menggunakan aturan ini untuk mencari tahu jenis dari berbagai nilai. Untuk melakukan ini, lihat ekspresi Anda (katakanlah
f x y
) dan temukan aturan yang memiliki kesimpulan (bagian bawah) yang cocok dengan pernyataan Anda. Sebut hal yang Anda coba temukan "tujuan" Anda. Dalam hal ini, Anda akan melihat aturan yang diakhirie₀ e₁
. Ketika Anda menemukan ini, Anda sekarang harus menemukan aturan yang membuktikan segala sesuatu di atas garis aturan ini. Hal-hal ini umumnya sesuai dengan jenis-jenis sub-ekspresi, jadi Anda pada dasarnya berulang pada bagian-bagian dari ekspresi. Anda hanya melakukan ini sampai Anda menyelesaikan pohon bukti Anda, yang memberi Anda bukti jenis ekspresi Anda.Jadi semua aturan ini lakukan adalah menentukan dengan tepat — dan dalam detail matematis yang biasa: P — bagaimana mencari tahu jenis-jenis ekspresi.
Sekarang, ini seharusnya terdengar akrab jika Anda pernah menggunakan Prolog — Anda pada dasarnya menghitung pohon bukti seperti penerjemah Prolog manusia. Ada alasan mengapa Prolog disebut "pemrograman logika"! Ini juga penting karena cara pertama saya diperkenalkan ke algoritma inferensi HM adalah dengan mengimplementasikannya dalam Prolog. Ini sebenarnya sangat sederhana dan membuat apa yang terjadi menjadi jelas. Anda tentu harus mencobanya.
Catatan: Saya mungkin membuat beberapa kesalahan dalam penjelasan ini dan akan senang jika seseorang mau menunjukkannya. Saya sebenarnya akan membahas ini di kelas dalam beberapa minggu, jadi saya akan lebih percaya diri kemudian: P.
sumber
Γ = {x : τ}
)λy.x : σ → τ
ke∀ σ. σ → τ
, tetapi tidak untuk∀ τ. σ → τ
, karenaτ
merupakan variabel bebas dalamΓ
. Artikel Wikipedia tentang HM menjelaskannya dengan cukup baik.[Inst]
itu sedikit tidak akurat. Ini hanya pemahaman saya sejauh ini, tetapi sigma di dalam[Inst]
dan[Gen]
aturan tidak mengacu pada tipe, tetapi untuk tipe-skema . Jadi⊑
operator adalah urutan parsial yang tidak terkait dengan sub-mengetik seperti yang kita tahu dari bahasa OO. Ini terkait dengan nilai-nilai polimorfik sepertiid = λx. x
. Sintaks lengkap untuk fungsi seperti itu adalahid = ∀x. λx. x
. Sekarang, kita jelas dapat memilikiid2 = ∀xy. λx. x
, di manay
tidak digunakan. Laluid2 ⊑ id
, itulah yang dikatakan[Inst]
aturan.Lihat " Yayasan Praktis Bahasa Pemrograman. ", Bab 2 dan 3, tentang gaya logika melalui penilaian dan derivasi. Seluruh buku sekarang tersedia di Amazon.
Bab 2
Definisi Induktif
Definisi induktif adalah alat yang sangat diperlukan dalam studi bahasa pemrograman. Dalam bab ini kita akan mengembangkan kerangka dasar definisi induktif, dan memberikan beberapa contoh penggunaannya. Definisi induktif terdiri dari seperangkat aturan untuk memperoleh penilaian , atau pernyataan , dari berbagai bentuk. Penghakiman adalah pernyataan tentang satu atau lebih objek sintaksis dari jenis tertentu. Aturan menentukan kondisi yang diperlukan dan cukup untuk validitas putusan, dan karenanya sepenuhnya menentukan maknanya.
2.1 Penghakiman
Kita mulai dengan gagasan tentang penilaian , atau penegasan tentang objek sintaksis. Kami akan menggunakan banyak bentuk penilaian, termasuk contoh-contoh seperti ini:
Suatu penilaian menyatakan bahwa satu atau lebih objek sintaksis memiliki sifat atau kedudukan dalam hubungan satu sama lain. Properti atau relasi itu sendiri disebut formulir penilaian , dan penilaian bahwa suatu objek atau objek memiliki properti atau kedudukan itu dalam relasi dikatakan sebagai contoh dari formulir penilaian itu. Bentuk penilaian juga disebut predikat , dan objek yang merupakan contoh adalah subjeknya . Kami menulis huruf J untuk penilaian yang menyatakan bahwa J berlaku untuk a . Ketika tidak penting untuk menekankan subjek penghakiman, (teks terpotong di sini)
sumber
Bagaimana saya memahami aturan Hindley-Milner?
Hindley-Milner adalah seperangkat aturan dalam bentuk kalkulus sekuens (bukan deduksi alami) yang menunjukkan bahwa kita dapat menyimpulkan jenis (paling umum) dari suatu program dari konstruksi program tanpa deklarasi tipe eksplisit.
Simbol dan notasi
Pertama, mari kita jelaskan simbolnya, dan diskusikan prioritas operator
𝜆𝑥.𝑒 berarti 𝜆 (lambda) adalah fungsi anonim yang mengambil argumen, 𝑥 , dan mengembalikan ekspresi, 𝑒 .
misalkan 𝑥 = 𝑒₀ dalam 𝑒₁ berarti dalam ekspresi, 𝑒₁ , gantikan 𝑒₀ di mana pun 𝑥 muncul.
⊑ berarti elemen sebelumnya adalah subtipe (informal - subkelas) dari elemen yang terakhir.
Segala sesuatu di atas garis adalah premis, semua di bawah ini adalah kesimpulan ( Per Martin-Löf )
Diutamakan, dengan contoh
Saya telah mengambil beberapa contoh yang lebih kompleks dari aturan dan menyisipkan tanda kurung berlebihan yang menunjukkan prioritas:
𝚪 ⊦ 𝑥 : 𝜎 dapat ditulis 𝚪 ⊦ ( 𝑥 : 𝜎 )
𝚪 ⊦ biarkan 𝑥 = 𝑒₀ di 𝑒₁ : 𝜏 setara dengan 𝚪 ⊦ (( biarkan ( 𝑥 = 𝑒₀ ) dalam 𝑒₁ ): 𝜏 )
𝚪 ⊦ 𝜆𝑥.𝑒 : 𝜏 → 𝜏 ' sama dengan 𝚪 ⊦ (( 𝜆𝑥.𝑒 ): ( 𝜏 → 𝜏' ))
Kemudian, ruang besar yang memisahkan pernyataan asersi dan prasyarat lainnya menunjukkan seperangkat prasyarat tersebut, dan akhirnya garis horizontal yang memisahkan premis dari kesimpulan memunculkan akhir urutan prioritas.
Aturan
Berikut ini adalah interpretasi bahasa Inggris dari aturan, masing-masing diikuti oleh pernyataan ulang yang longgar dan penjelasan.
Variabel
Dengan kata lain, dalam 𝚪, kita tahu 𝑥 bertipe 𝜎 karena 𝑥 bertipe 𝜎 dalam 𝚪.
Ini pada dasarnya adalah tautologi. Nama pengenal adalah variabel atau fungsi.
Aplikasi fungsi
Untuk menyatakan kembali aturan, kita tahu bahwa aplikasi fungsi mengembalikan tipe 𝜏 'karena fungsi tersebut bertipe 𝜏 → 𝜏' dan mendapatkan argumen tipe 𝜏.
Ini berarti bahwa jika kita tahu bahwa suatu fungsi mengembalikan tipe, dan kita menerapkannya pada argumen, hasilnya akan menjadi instance dari tipe yang kita tahu itu mengembalikan.
Abstraksi fungsi
Sekali lagi, ketika kita melihat fungsi yang mengambil 𝑥 dan mengembalikan ekspresi 𝑒, kita tahu itu bertipe 𝜏 → 𝜏 'karena 𝑥 (a 𝜏) menyatakan bahwa 𝑒 adalah a 𝜏'.
Jika kita tahu 𝑥 adalah tipe 𝜏 dan dengan demikian ekspresi 𝑒 adalah tipe 𝜏 ', maka fungsi 𝑥 ekspresi kembali 𝑒 adalah tipe 𝜏 → 𝜏'.
Biarkan deklarasi variabel
Secara longgar, 𝑥 terikat ke 𝑒₀ dalam 𝑒₁ (a 𝜏) karena 𝑒₀ adalah 𝜎, dan 𝑥 adalah 𝜎 yang menyatakan 𝑒₁ adalah a 𝜏.
Ini berarti jika kita memiliki ekspresi 𝑒₀ yang merupakan 𝜎 (menjadi variabel atau fungsi), dan beberapa nama, 𝑥, juga 𝜎, dan ekspresi 𝑒₁ dari tipe 𝜏, maka kita dapat mengganti 𝑒₀ untuk 𝑥 di mana pun ia muncul di dalam dari 𝑒₁.
Instansiasi
Ekspresi, 𝑒 adalah tipe induk 𝜎 karena ekspresi 𝑒 adalah subtipe 𝜎 ', dan 𝜎 adalah tipe induk 𝜎'.
Jika sebuah instance dari tipe yang merupakan subtipe dari tipe lain, maka itu juga merupakan instance dari tipe-super - tipe yang lebih umum.
Generalisasi
Jadi secara umum, 𝑒 diketik 𝜎 untuk semua variabel argumen (𝛼) yang dikembalikan 𝜎, karena kita tahu bahwa 𝑒 adalah 𝜎 dan 𝛼 bukan variabel bebas.
Ini berarti kita dapat menggeneralisasi suatu program untuk menerima semua jenis argumen yang belum terikat dalam cakupan yang berisi (variabel yang bukan lokal). Variabel terikat ini dapat diganti.
Menyatukan semuanya
Dengan asumsi tertentu (seperti tidak ada variabel bebas / tidak terdefinisi, lingkungan yang diketahui), kita mengetahui jenis-jenis:
Kesimpulan
Gabungan aturan ini memungkinkan kami untuk membuktikan jenis paling umum dari program yang dinyatakan, tanpa memerlukan anotasi jenis.
sumber
Notasi berasal dari deduksi alami .
Simbol ⊢ disebut pintu pagar .
Keenam aturan itu sangat mudah.
Var
aturan adalah aturan yang agak sepele - ia mengatakan bahwa jika tipe untuk pengenal sudah ada di lingkungan tipe Anda, maka untuk menyimpulkan tipe yang baru saja Anda ambil dari lingkungan apa adanya.App
aturan mengatakan bahwa jika Anda memiliki dua pengidentifikasie0
dane1
dan dapat menyimpulkan tipe mereka, maka Anda dapat menyimpulkan jenis aplikasie0 e1
. Aturan membaca seperti ini jika Anda tahu itue0 :: t0 -> t1
dane1 :: t0
(t0 yang sama!), Maka aplikasi diketik dengan baik dan tipenyat1
.Abs
danLet
aturan untuk menyimpulkan tipe untuk lambda-abstraksi dan masuk.Inst
aturan mengatakan bahwa Anda dapat mengganti tipe dengan yang kurang umum.sumber
Ada dua cara untuk memikirkan e: σ. Salah satunya adalah "ekspresi e memiliki tipe σ", yang lain adalah "pasangan berurut dari ekspresi e dan tipe σ".
Lihat Γ sebagai pengetahuan tentang jenis ekspresi, diimplementasikan sebagai satu set pasangan ekspresi dan jenis, e: σ.
Pintu putar ⊢ berarti bahwa dari pengetahuan di sebelah kiri, kita dapat menyimpulkan apa yang ada di sebelah kanan.
Dengan demikian, aturan pertama [Var] dapat dibaca:
Jika pengetahuan kita Γ berisi pasangan e: σ, maka kita dapat menyimpulkan dari Γ bahwa e memiliki tipe σ.
Aturan kedua [Aplikasi] dapat dibaca:
Jika kita dari Γ dapat menyimpulkan bahwa e_0 memiliki tipe τ → τ ', dan kita dari Γ dapat menyimpulkan bahwa e_1 memiliki tipe τ, maka kita dari Γ dapat menyimpulkan bahwa e_0 e_1 memiliki ketik τ '.
Adalah umum untuk menulis Γ, e: σ alih-alih Γ ∪ {e: σ}.
Dengan demikian, aturan ketiga [Abs] dapat dibaca:
Jika kita dari Γ diperpanjang dengan x: τ dapat menyimpulkan bahwa e memiliki tipe τ ', maka kita dari Γ dapat menyimpulkan bahwa λx.e memiliki tipe τ → τ'.
Aturan keempat [Biarkan] dibiarkan sebagai latihan. :-)
Aturan kelima [Inst] dapat dibaca:
Jika kita dari Γ dapat menyimpulkan bahwa e memiliki tipe σ ', dan σ' adalah subtipe dari σ, maka kita dari Γ dapat menyimpulkan bahwa e memiliki tipe σ.
Aturan keenam dan terakhir [Gen] dapat dibaca:
Jika kita dari Γ dapat menyimpulkan bahwa e memiliki tipe σ, dan α bukan variabel tipe bebas di salah satu tipe dalam Γ, maka kita dari Γ dapat menyimpulkan bahwa e memiliki tipe ∀α σ.
sumber