Giả sử rằng bạn mở rộng Tính toán công trình bằng "lỗ hổng" - tức là các đoạn mã chưa hoàn chỉnh mà bạn chưa điền. Tôi tự hỏi nếu có một thuật toán để tự động điền các vai trò đó. Ví dụ: (sử dụng cú pháp của Morte ):
Trường hợp A:
λ (pred : ?)
-> λ (Nat : *)
-> λ (Succ : Nat -> Nat)
-> λ (Zero : Nat)
-> (Succ (pred Nat Succ Zero))
Về tình hình này, một thuật toán suy luận kiểu có thể xác định rằng ?
có thể rõ ràng là chỉ có ∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Nat
, bởi vì pred
nhận được Nat : *
, Succ : Nat -> Nat
, Zero : Nat
, và phải trả lại Nat
, bởi vì nó là đối số đầu tiên của Succ
.
Trường hợp B:
(Id ? 4)
Trong đó 4 được mã hóa và Id
là hàm nhận dạng (nghĩa là ∀ (t:*) -> λ (x:t) -> x
). Trong tình huống đó, ả? ´ lại rõ ràng ∀ (N:*) -> (N -> N) -> N -> N
, vì đó là kiểu 4
.
Trường hợp C:
(Id (Equals Nat 7 (add 3 ?)) (Refl 7))
Ở đây, Equals
và Refl
được định nghĩa theo cách tương tự như Idris. ?
Rõ ràng chỉ có thể được 4
, nhưng làm thế nào để bạn tìm ra điều đó? Một cách sẽ là sử dụng thực tế rằng ? : Nat
, và Nat
là một loại mà chúng ta biết cách liệt kê, vì vậy chúng ta có thể thử tất cả Nats
cho đến khi nó đánh máy. Điều đó có thể được thực hiện cho bất kỳ loại vô số.
Trường hợp D:
(Id (Equal Nat 10 (MulPair ?)) 10)
Ở đây, ?
chỉ có thể là loại Pair Nat
; nó chỉ có hơn một câu trả lời hợp lệ, mặc dù: nó có thể được (Pair 10 1)
, (Pair 2 5)
, (Pair 5 2)
và (Pair 1 10)
.
Trường hợp E:
(Id (Equal Nat 7 (Mul 2 ?)) 7)
Ở đây, không có câu trả lời hợp lệ, vì 7
không phải là bội số của 2
.
Tất cả những ví dụ đó khiến tôi nhận thấy rằng chúng ta có thể tạo ra một thuật toán chung xác định một số mẫu đã biết và đưa ra câu trả lời bằng cách chọn một thuật toán cụ thể (suy luận kiểu, vũ lực, v.v.), giống như Wolfram Alpha tìm ra chiến lược đúng giải một tích phân. Nhưng điều đó có vẻ như một cách tiếp cận kỹ thuật / mã hóa cứng. Có một cách nguyên tắc để giải quyết vấn đề này? Có bất kỳ nghiên cứu / khu vực trên đó?