Penulis : (1) David Binder, Universitas Tübingen, Jerman; (2) Marco Tzschentke, Universitas Tübingen, Jerman; (3) Marius Muller, Universitas Tübingen, Jerman; (4) Klaus Ostermann, Universitas Tübingen, Jerman. Authors: (1) David Binder, Universitas Tübingen, Jerman; (2) Marco Tzschentke, Universitas Tübingen, Jerman; (3) Marius Muller, Universitas Tübingen, Jerman; (4) Klaus Ostermann, Universitas Tübingen, Jerman. Tabel dari kiri Introduction Translating To Sequent Calculus 2.1 Arithmetic Expressions 2.2 Let Bindings 2.3 Top-level Definitions 2.4 Algebraic Data and Codata Types 2.5 First-Class Functions 2.6 Control Operators Evaluation Within a Context 3.1 Evaluation Contexts for Fun 3.2 Focusing on Evaluation in Core Typing Rules 4.1 Typing Rules for Fun 4.2 Typing Rules for Core 4.3 Type Soundness Insights 5.1 Evaluation Contexts are First Class 5.2 Data is Dual to Codata 5.3 Let-Bindings are Dual to Control Operators 5.4 The Case-of-Case Transformation 5.5 Direct and Indirect Consumers 5.6 Call-By-Value, Call-By-Name and Eta-Laws 5.7 Linear Logic and the Duality of Exceptions Related Work Conclusion, Data Availability Statement, and Acknowledgments Introduksi Tipe Aturan Kerja terkait Kesimpulan, pernyataan ketersediaan data, dan pengakuan A. Hubungan dengan perhitungan berurutan B. Menulis aturan untuk menyenangkan C. Semantik Operasional dari Label / Goto Referensi 1 Pengantar Katakanlah Anda baru saja menerapkan bahasa fungsional kecil Anda sendiri. untuk mengujinya, Anda menulis fungsi berikut yang melipatgandakan semua angka yang terkandung dalam daftar: Ayat (1) huruf b huruf b huruf a huruf b huruf a huruf b huruf a huruf b huruf a Apa yang membingungkan Anda tentang implementasi ini adalah bahwa Anda tahu optimasi yang jelas: Fungsi harus langsung mengembalikan nol jika bertemu dengan nol dalam daftar. Ada banyak cara untuk mencapai ini, tetapi Anda memilih untuk memperluas bahasa Anda dengan ekspresi yang diberi label dan instruksi goto. Ini memungkinkan Anda untuk menulis versi yang dioptimalkan: def mult(l) label α { mult’(l; α) } Maka dari itu, jangan lupa untuk mengkonsumsi buah-buahan yang mengandung gizi yang tinggi, karena buah-buahan yang mengandung gizi yang tinggi akan sangat bermanfaat bagi tubuh. Berikut ini adalah cara Anda membaca snippet ini: Selain argumen daftar l, definisi def mult(l; α) . . . mengambil argumen α yang menunjukkan bagaimana perhitungan harus berlanjut setelah hasil multiplikasi dihitung (kita sekali lagi menggunakan ; untuk memisahkan dua jenis argumen). fungsi pembantu mult’ mengambil argumen daftar l dan dua argumen α dan β; argumen β menunjukkan di mana fungsi harus kembali ke pada panggilan recursive normal sementara α menunjukkan titik balik dari perhitungan recursive pendek. Dalam tubuh mult’ kita menggunakan l l case {Nil ⇒ . . . , Cons(x, xs) ⇒ . . . .} mungkin untuk melakukan kasus pembagian pada daftar l dan β. Jika daftar adalah Nil, maka kita menggunakan 1 l β untuk kembali ke β, yang merupakan kembalinya untuk panggilan recursive normal. Jika The λμμ ̃-calculus yang baru saja Anda lihat pertama kali diperkenalkan oleh Curien dan Herbelin [2000] sebagai solusi untuk pertanyaan terbuka lama: Apa yang seharusnya bahasa istilah untuk kalkulus berurutan terlihat seperti? The sequential calculus adalah salah satu dari dua kalkulus bukti yang berpengaruh diperkenalkan oleh Gentzen [1935a,b] dalam sebuah makalah tunggal, kalkulus yang lain adalah deduksi alami. Bahasa istilah untuk deduksi alami adalah lambda kalkulus biasa, tetapi sulit untuk menemukan bahasa istilah yang baik untuk kalkulus berurutan. Setelah ditemukan, λμμ ̃-calculus diusulkan sebagai dasar yang lebih baik untuk bahasa perantara kompiler, misalnya oleh Downen et al. [2016]. Terlepas dari hal ini, sebagian besar desain bahasa dan penulis kompilator masih tidak akrab dengannya. Ini adalah situasi yang kita berharap untuk memperbaiki dengan Kita sering mendiskusikan ide-ide yang melibatkan kalkulus λμμ dengan siswa dan kolega dan oleh karena itu harus memperkenalkan mereka ke ide-ide sentralnya. Tetapi kita biasanya tidak dapat memotivasi kalkulus λμμ sebagai sistem atribusi istilah untuk kalkulus berurutan, karena kebanyakan dari mereka tidak akrab dengannya. Kita sebaliknya menjelaskan kalkulus λμμ pada papan putih dengan mengkompilasi program fungsional kecil ke dalamnya. Pengantar seperti itu sayangnya masih hilang dalam literatur yang diterbitkan; sebagian besar presentasi yang ada baik mengasumsikan pengetahuan tentang kalkulus berurutan atau sebaliknya menghabiskan banyak ruang memperkenalkan itu terlebih dahulu. Kami percaya bahwa jika seseorang dapat memahami kalkulus lambdaus tanpa pertama belajar tentang bukti deduksi alami, maka seseorang juga harus dapat memahami kalkulus λμμ tanpa mengetahui kalkulus berurutan[1]. Mengapa kita bersemangat tentang kalkulus λμμ ̃, dan mengapa kita berpikir bahwa lebih banyak orang harus menjadi akrab dengan gagasan dan konsep sentralnya? Fitur utama yang membedakan kalkulus λμμ ̃ dari kalkulus lambda adalah perlakuan kelas pertama dari konteks evaluasi. Ini menjadi lebih jelas dengan contoh: Ketika kita ingin mengevaluasi ekspresi (2 + 3) ∗ 5, kita harus terlebih dahulu fokus pada subekspresi 2 + 3 dan mengevaluasikannya ke hasilnya 5. Sisanya dari program, yang akan berjalan setelah kita selesai mengevaluasi, dapat diwakili dengan konteks evaluasi □ ∗ 5. Kita tidak dapat mengikat konteks evaluasi seperti □ ∗ 5 ke konteks evaluasi tidak selalu diperlukan bagi seorang pemrograman yang ingin menulis aplikasi, tetapi seringkali penting bagi implementator kompilator yang menulis optimisasi untuk membuat program berjalan lebih cepat. Selanjutnya, μ-operator memberikan akses langsung ke konteks evaluasi di mana ekspresi saat ini dievaluasi. Memiliki akses langsung ke konteks evaluasi tidak selalu diperlukan bagi seorang programmer yang ingin menulis aplikasi, tetapi seringkali penting bagi implementator kompilator yang menulis optimisasi untuk membuat program berjalan lebih cepat. Selebihnya dari kertas ini disusun sebagai berikut: • Dalam Bagian 2, kami memperkenalkan bahasa permukaan Fun dan menunjukkan bagaimana kita dapat menerjemahkannya ke dalam bahasa Core berbasis kalkulus sekuensial. Bahasa permukaan sebagian besar adalah bahasa pemrograman fungsional yang berorientasi ekspresi, tetapi kami telah menambahkan beberapa fitur seperti jenis codata dan operator kontrol yang terjemahan memberikan wawasan penting tentang bagaimana λμμ ̃-calculus bekerja. • Dalam Bagian 3, kita membahas fokus statis dan dinamis, yang merupakan dua teknik yang terkait erat untuk mengangkat subekspresi yang bukan nilai ke posisi di mana mereka dapat dievaluasi. Bagian 4 memperkenalkan aturan penulisan untuk Fun dan Core dan membuktikan hasil standar tentang penulisan dan evaluasi. Kami menyajikan berbagai konsep bahasa pemrograman yang menjadi jauh lebih jelas ketika kami menyajikan mereka dalam kalkulus λμμ ̃: Kami menunjukkan bahwa let-bindings adalah persis dual untuk mengendalikan operator, bahwa data dan jenis codata adalah dua cara yang sangat dual untuk menentukan jenis, dan bahwa transformasi kasus-of-case tidak lebih dari μ-reduction. wawasan ini tidak baru bagi seseorang yang akrab dengan kalkulus λμμ ̃, tetapi belum dikenal luas seperti seharusnya. • Akhirnya, di Bagian 6 kami membahas pekerjaan terkait dan memberikan petunjuk untuk pembacaan lebih lanjut. Dokumen ini disertai dengan implementasi Haskell yang juga kami sediakan sebagai situs web interaktif (lihat Gambar 1). Dokumen ini tersedia di archiv di bawah lisensi CC BY 4.0. Kertas ini adalah dengan lisensi CC BY 4.0. available on arxiv Tersedia di Arsip [1] Untuk pembaca yang tertarik, kami menunjukkan dalam Lampiran A bagaimana kalkulus berurutan dan kalkulus λμμ ̃ terhubung.