Bagian mana dari Hindley-Milner yang tidak Anda mengerti?


851

Saya bersumpah dulu ada T-shirt untuk dijual yang menampilkan kata-kata abadi:


Bagian dari apa

Hindley-Milner

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.


8
Jika Anda sedang mencari penjelasan yang baik dari algoritma, yang terbaik yang saya telah menemukan sejauh ini dalam bab 30 dari Shriram Krishnamurthi ini Bahasa Pemrograman: Aplikasi dan Interpretasi (! CC berlisensi).
laslowh

2
@laslowh Terima kasih! Saya membacanya. Versi yang lebih baru: cs.brown.edu/courses/cs173/2012/book/book.pdf
SnowOnion

Jawaban:


652
  • The bar horisontal berarti bahwa "[atas] menyiratkan [bawah]".
  • Jika ada banyak ekspresi di [atas], maka pertimbangkan dan anded bersama-sama; semua [di atas] harus benar untuk menjamin [di bawah].
  • :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 itu x : σ ∈ Γberarti lingkungan Γtermasuk fakta yang xbertipe σ.
  • dapat dibaca sebagai membuktikan atau menentukan. Γ ⊢ x : σberarti bahwa lingkungan Γmenentukan yang xmemiliki tipe σ.
  • ,adalah cara memasukkan asumsi tambahan spesifik ke dalam suatu lingkungan Γ.
    Oleh karena itu, Γ, x : τ ⊢ e : τ'berarti lingkungan itu Γ, dengan asumsi tambahan, utama yang xmemiliki tipeτ , membuktikan bahwa ememiliki tipe τ'.

Seperti yang diminta: prioritas operator, dari tertinggi ke terendah:

  • Bahasa khusus infiks dan mixfix operator, seperti λ x . e, ∀ α . σ, dan τ → τ', let x = e0 in e1, dan spasi untuk aplikasi fungsi.
  • :
  • dan
  • , (asosiatif kiri)
  • spasi putih memisahkan banyak proposisi (asosiatif)
  • bilah horizontal

19
Apa aturan prioritas operator?
Randomblue

: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 itu x ∈ Sberarti bahwa suatu himpunan Ssecara harfiah mengandung suatu unsur x, sedangkan Γ ⊢ x : Tsarana yang xdapat disimpulkan untuk menghuni tipe Tdalam konteks Γ. Mempertimbangkan hal ini, aturan Var berbunyi: »Jika x secara harfiah terkandung dalam konteksnya, ia dapat (secara sepele) disimpulkan darinya«.
David

@Randomblue saya membuat eksplisit didahulukan dari simbol-simbol dengan menambahkan tanda kurung di mana-mana, misalnya (Γ,(x:τ))⊢(x:σ), melihat overleaf.com/read/ddmnkzjtnqbd#/61990222
SnowOnion

327

Sintaks 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 yang xmemiliki tipe σ. Anda dapat membacanya seperti milik Haskell x :: σ.

Apa arti setiap aturan

Jadi, mengetahui hal ini, ungkapan pertama menjadi mudah dipahami: jika kita tahu bahwa x : σ ∈ Γ(yaitu, xmemiliki beberapa tipe σdalam beberapa konteks Γ), maka kita tahu bahwa Γ ⊢ x : σ(yaitu, dalam Γ, xmemiliki 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 τ'dan e₁merupakan nilai tipe τ. Sekarang Anda tahu apa jenis Anda akan mendapatkan dengan menerapkan e₀untuk e₁! Semoga ini bukan kejutan :).

Aturan selanjutnya memiliki beberapa sintaks baru. Khususnya, Γ, x : τadil artinya konteks terdiri dari Γdan penilaian x : τ. Jadi, jika kita tahu bahwa variabel xmemiliki tipe τdan ekspresi ememiliki tipe τ', kita juga tahu tipe fungsi yang mengambil xdan mengembalikan e. 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 letpernyataan. Jika Anda tahu bahwa beberapa ekspresi e₁memiliki tipe τselama xmemiliki tipe σ, maka letekspresi yang secara lokal mengikat xnilai tipe σakan membuat e₁memiliki tipe τ. Sungguh, ini hanya memberi tahu Anda bahwa pernyataan let pada dasarnya memungkinkan Anda memperluas konteks dengan pengikatan baru — yang persis seperti letitu!

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 ketahui e : σ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 diakhiri e₀ 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.


5
\ alpha adalah variabel tipe tidak bebas, bukan variabel biasa. Jadi untuk menjelaskan aturan generalisasi, banyak yang harus dijelaskan.
nponeccop

2
@nponeccop: Hmm, poin bagus. Saya belum benar-benar melihat aturan khusus itu sebelumnya. Bisakah Anda membantu saya menjelaskannya dengan benar?
Tikhon Jelvis

8
@TikhonJelvis: Ini sebenarnya cukup sederhana, memungkinkan Anda untuk menggeneralisasi (asumsi Γ = {x : τ}) λy.x : σ → τke ∀ σ. σ → τ, tetapi tidak untuk ∀ τ. σ → τ, karena τmerupakan variabel bebas dalam Γ. Artikel Wikipedia tentang HM menjelaskannya dengan cukup baik.
Vitus

7
Saya percaya bagian dari jawaban yang berhubungan dengan [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 seperti id = λx. x. Sintaks lengkap untuk fungsi seperti itu adalah id = ∀x. λx. x. Sekarang, kita jelas dapat memiliki id2 = ∀xy. λx. x, di mana ytidak digunakan. Lalu id2 ⊑ id, itulah yang dikatakan [Inst]aturan.
Ionuț G. Stan

71

jika seseorang setidaknya bisa memberi tahu saya di mana harus mulai mencari untuk memahami apa arti lautan simbol ini

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:

  • n nat - n adalah bilangan alami
  • n = n1 + n2 - n adalah jumlah dari n1 dan n2
  • tipe τ - τ adalah tipe
  • e : τ - ekspresi e memiliki tipe τ
  • ev - ekspresi e memiliki nilai v

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)


53

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

  • 𝑥 adalah pengidentifikasi (secara informal, nama variabel).
  • : means adalah jenis (secara informal, instance dari, atau "is-a").
  • 𝜎 (sigma) adalah ekspresi yang bisa berupa variabel atau fungsi.
  • jadi 𝑥: 𝜎 dibaca " 𝑥 is-a 𝜎 "
  • ∈ berarti "adalah elemen dari"
  • 𝚪 (Gamma) adalah lingkungan.
  • (tanda asersi) berarti menegaskan (atau membuktikan, tetapi "menegaskan" secara kontekstual lebih baik.)
  • 𝚪 ⊦ 𝑥 : 𝜎 dibaca "𝚪 menyatakan bahwa 𝑥, is-a 𝜎 "
  • 𝑒 adalah instance (elemen) aktual dari tipe 𝜎 .
  • 𝜏 (tau) adalah tipe: baik dasar, variabel ( 𝛼 ), fungsional 𝜏 → 𝜏 ' , atau produk 𝜏 × 𝜏' (produk tidak digunakan di sini)
  • 𝜏 → 𝜏 ' adalah tipe fungsional di mana 𝜏 dan 𝜏' adalah tipe yang berpotensi berbeda.
  • 𝜆𝑥.𝑒 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.

  • 𝛼 adalah variabel tipe.
  • 𝛼.𝜎 adalah tipe, ∀ (untuk semua) variabel argumen, 𝛼 , mengembalikan 𝜎 ekspresi
  • gratis (𝚪) berarti bukan elemen variabel tipe bebas dari 𝚪 yang didefinisikan dalam konteks luar. (Variabel terikat dapat diganti.)

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 (𝑥: 𝜎) ∈ 𝚪
  • 𝚪 ⊦ 𝑥 : 𝜎 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

Diagram Logika VAR

Mengingat 𝑥 adalah jenis 𝜎 (sigma), elemen 𝚪 (Gamma),
menyimpulkan conc menegaskan 𝑥 adalah a 𝜎.

Dengan kata lain, dalam 𝚪, kita tahu 𝑥 bertipe 𝜎 karena 𝑥 bertipe 𝜎 dalam 𝚪.

Ini pada dasarnya adalah tautologi. Nama pengenal adalah variabel atau fungsi.

Aplikasi fungsi

Diagram Logika Aplikasi

Diberikan 𝚪 menegaskan 𝑒₀ adalah tipe fungsional dan 𝚪 menegaskan 𝑒₁ adalah 𝜏
menyimpulkan 𝚪 menegaskan menerapkan fungsi 𝑒₀ ke 𝑒₁ adalah tipe 𝜏 '

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

Diagram Logika ABS

Mengingat 𝚪 dan 𝑥 tipe 𝜏 menegaskan 𝑒 adalah tipe, 𝜏 '
menyimpulkan 𝚪 menyatakan fungsi anonim, 𝜆 dari 𝑥 ekspresi balik, 𝑒 adalah tipe 𝜏 → 𝜏'.

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

BIARKAN Diagram Logika

Mengingat 𝚪 menegaskan 𝑒₀, tipe 𝜎, dan 𝚪 dan 𝑥, tipe 𝜎, menegaskan 𝑒₁ tipe 𝜏
menyimpulkan 𝚪 menegaskan let𝑥 = 𝑒₀ in𝑒₁ tipe 𝑒₁

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

INST Logic Diagram

Diberikan 𝚪 menegaskan 𝑒 dari tipe 𝜎 'dan 𝜎' adalah subtipe dari 𝜎
menyimpulkan 𝚪 menegaskan 𝑒 adalah tipe 𝜎

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

Diagram Logika GEN

Mengingat 𝚪 menegaskan 𝑒 adalah 𝜎 dan 𝛼 bukan merupakan elemen dari variabel bebas 𝚪,
simpulkan 𝚪 menegaskan 𝑒, ketik untuk semua ekspresi argumen 𝛼 mengembalikan 𝜎 ekspresi

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:

  • elemen atom dari program kami (Variabel),
  • nilai yang dikembalikan oleh fungsi (Aplikasi Fungsi),
  • konstruksi fungsional (Abstraksi Fungsi),
  • biarkan binding (Biarkan Deklarasi Variabel),
  • jenis induk dari instance (Instantiation), dan
  • semua ekspresi (Generalisasi).

Kesimpulan

Gabungan aturan ini memungkinkan kami untuk membuktikan jenis paling umum dari program yang dinyatakan, tanpa memerlukan anotasi jenis.


1
rekap yang begitu bagus Aaron!
bhurlow

48

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.

Appaturan mengatakan bahwa jika Anda memiliki dua pengidentifikasi e0dan e1dan dapat menyimpulkan tipe mereka, maka Anda dapat menyimpulkan jenis aplikasi e0 e1. Aturan membaca seperti ini jika Anda tahu itu e0 :: t0 -> t1dan e1 :: t0(t0 yang sama!), Maka aplikasi diketik dengan baik dan tipenya t1.

Absdan Letaturan untuk menyimpulkan tipe untuk lambda-abstraksi dan masuk.

Inst aturan mengatakan bahwa Anda dapat mengganti tipe dengan yang kurang umum.


4
Ini adalah kalkulus berurutan, bukan deduksi alami.
Roman Cheplyaka

12
@RomanCheplyaka, notasinya hampir sama. Artikel wikipedia memiliki perbandingan yang menarik dari dua teknik: en.wikipedia.org/wiki/Natural_deduction#Sequent_calculus . Kalkulus berurutan lahir sebagai respons langsung terhadap kegagalan deduksi alami, jadi jika pertanyaannya adalah "dari mana notasi ini berasal", maka "deduksi alami" secara teknis merupakan jawaban yang lebih benar.
Dan Burton

2
@RomanCheplyaka Pertimbangan lain adalah sekuens kalkulus murni sintaksis (itulah sebabnya ada begitu banyak aturan struktural) sementara notasi ini tidak. Aturan pertama mengasumsikan bahwa konteks adalah himpunan sementara dalam kalkulus berurutan itu adalah konstruksi sintaksis yang lebih sederhana.
nponeccop

@ Cheplyaka sebenarnya, tidak, ia memiliki sesuatu yang terlihat seperti "urutan" tetapi bukan kalkulus berurutan. Haper mengembangkan pemahaman tentang hal ini dalam buku teksnya sebagai "penilaian tingkat tinggi." Ini benar-benar deduksi alami.
Philip JF

15

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 ∀α σ.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.