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 pred
menerima 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 Id
merupakan 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, Equals
dan Refl
didefinisikan dengan cara yang mirip dengan Idris. ?
jelas bisa saja 4
, tetapi bagaimana Anda mengetahuinya? Salah satu cara akan menggunakan fakta itu ? : Nat
, dan Nat
merupakan jenis yang kita tahu cara menghitung, jadi kita bisa mencoba semua Nats
sampai 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 7
bukan 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?