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?