Apakah ada algoritma umum untuk mengisi lubang dalam hal Kalkulus Konstruksi?


9

Misalkan Anda memperpanjang Kalkulus Konstruksi dengan "lubang" - yaitu, potongan kode tidak lengkap yang belum Anda isi. Saya ingin tahu apakah ada algoritma untuk mengisi peran itu secara otomatis. Misalnya (menggunakan sintaksis Morte ):

Kasus A:

λ (pred : ?) 
-> λ (Nat : *) 
-> λ (Succ : Nat -> Nat) 
-> λ (Zero : Nat)
-> (Succ (pred Nat Succ Zero))

Pada situasi ini, algoritma inferensi tipe dapat mengidentifikasi bahwa ?dapat jelas hanya menjadi ∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Nat, karena predmenerima Nat : *, Succ : Nat -> Nat, Zero : Nat, dan harus kembali Nat, karena itu adalah argumen pertama Succ.

Kasus B:

(Id ? 4)

Di mana 4 dikodekan λ dan Idmerupakan fungsi identitas (yaitu, ∀ (t:*) -> λ (x:t) -> x). Pada situasi itu, ´? ´ sekali lagi jelas ∀ (N:*) -> (N -> N) -> N -> N, karena itu adalah tipe 4.

Kasus C:

(Id (Equals Nat 7 (add 3 ?)) (Refl 7))

Di sini, Equalsdan Refldidefinisikan dengan cara yang mirip dengan Idris. ?jelas bisa saja 4, tetapi bagaimana Anda mengetahuinya? Salah satu cara akan menggunakan fakta itu ? : Nat, dan Natmerupakan jenis yang kita tahu cara menghitung, jadi kita bisa mencoba semua Natssampai mengetikkannya. Itu bisa dilakukan untuk semua jenis enumerable.

Kasus D:

(Id (Equal Nat 10 (MulPair ?)) 10)

Di sini, ?hanya bisa bertipe Pair Nat; hanya memiliki lebih dari satu jawaban yang valid, meskipun: itu bisa (Pair 10 1), (Pair 2 5), (Pair 5 2)dan (Pair 1 10).

Kasus E:

(Id (Equal Nat 7 (Mul 2 ?)) 7)

Di sini, tidak ada jawaban yang valid, karena 7bukan merupakan kelipatan dari 2.


Semua contoh itu membuat saya memperhatikan bahwa kita dapat membuat algoritma umum yang mengidentifikasi beberapa pola yang diketahui dan memberikan jawaban dengan memilih algoritma tertentu (tipe inferensi, brute-force, dan sebagainya), agak seperti Wolfram Alpha menggambarkan strategi yang tepat untuk memecahkan Integral. Tapi itu terdengar seperti pendekatan rekayasa / hardcode. Apakah ada cara berprinsip untuk menyelesaikan masalah ini? Apakah ada studi / bidang penelitian di sana?

Jawaban:


9

Tentu saja ada banyak penelitian tentang masalah ini! Itu sering berjalan dengan nama elaborasi . Ini adalah masalah yang tidak dapat diputuskan secara umum, seperti yang mungkin sudah Anda duga. "Lubang" sering disebut meta-variabel atau variabel unifikasi .

Seperti yang saya jelaskan sedikit dalam jawaban ini , masalahnya berkurang menjadi penyatuan urutan yang lebih tinggi , di mana beberapa orang telah menulis disertasi PhD secara keseluruhan.

Seperti yang Anda catat dalam contoh Anda, beberapa kasus agak mudah, dan dapat diselesaikan dengan penerapan aturan sederhana, sedangkan beberapa tampaknya secara signifikan lebih sulit, dan memiliki lebih banyak "pembuktian teorema" yang terasa bagi mereka.

Kasus ketiga yang mungkin adalah masalah tipe "tipe kelas", di mana ?mewakili beberapa jenis struktur , seperti grup atau struktur bidang, seperti dalam

mul ? 2 3

dengan mul : forall G:Group, G.carrier -> G.carrier -> G.carrieratau beberapa varian. Di sini kita perlu menemukan yang Gseperti itu G.carrier == nat.

Secara umum, Anda ingin memiliki 3 "rezim" yang berbeda untuk masing-masing jenis masalah, penyatuan sederhana, pembuktian teorema, dan masing-masing jenis penyelesaian masalah kelas.

Kami sedikit menjelaskan hal ini di makalah berikut ini:

Elaborasi dalam Teori Ketergantungan Type , de Moura, Avigad, Kong & Roux.

Anda mungkin ingin melihat referensi makalah itu untuk info lebih lanjut.


Aku sudah Anda punya perut yang kuat, di sini adalah open-source untuk elaborasi di Ramping.

Berikut adalah posting wiki yang menjelaskan antarmuka ke elaborator di Idris.


Itulah kata-kata yang ingin saya dengar! Terima kasih untuk semua tautan, referensi, dan kata kunci itu, Anda memberi saya banyak hal untuk dilakukan sekarang. Apakah ada alat yang tersedia yang dapat saya gunakan untuk menyelesaikan program Morte hari ini? Tentu saja tidak harus Morte tetapi sesuatu yang cukup dekat untuk mengekstrak program Morte.
MaiaVictor

1
Setiap teorema dan pemeriksa tipe untuk sistem yang diketik secara dependen (Idris, Agda, Coq, Lean) akan memiliki pemecah yang demikian dalam di dalam nyali mereka. Mereka cenderung sangat spesifik untuk program, jadi saya tidak optimis Anda dapat menggunakannya untuk keperluan Anda sendiri tanpa modifikasi berat.
cody
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.