Calculus of Constructionsを「穴」で拡張するとします。つまり、まだ埋めていない不完全なコード片です。これらの役割を自動的に埋めるアルゴリズムはあるのでしょうか。例(モートの構文を使用):
ケースA:
λ (pred : ?)
-> λ (Nat : *)
-> λ (Succ : Nat -> Nat)
-> λ (Zero : Nat)
-> (Succ (pred Nat Succ Zero))
このような状況では、型推論アルゴリズムは、それが識別することができ?、明らかに唯一できる∀ (Nat : *) -> (Nat -> Nat) -> Nat -> Natので、pred受信Nat : *、Succ : Nat -> Nat、Zero : Nat、と返す必要がありNat、それは最初の引数であるため、Succ。
ケースB:
(Id ? 4)
ここで、4はλエンコードされId、単位関数(すなわち、∀ (t:*) -> λ (x:t) -> x)です。そのような状況では、「?」は再び明確∀ (N:*) -> (N -> N) -> N -> Nになり4ます。
ケースC:
(Id (Equals Nat 7 (add 3 ?)) (Refl 7))
ここでは、EqualsとReflイドリスと同様の方法で定義されています。?明らかにできるのはだけですが4、どうやってそれを理解するのですか?1つの方法は、、? : NatおよびNatが列挙方法を知っている型であることを使用することです。そのため、型Natsチェックまですべてを試すことができます。これは、列挙可能な任意の型に対して実行できます。
ケースD:
(Id (Equal Nat 10 (MulPair ?)) 10)
ここで?は、タイプのみにすることができPair Natます。それができる:けれども、それは、唯一つ以上の有効な答えを持って(Pair 10 1)、(Pair 2 5)、(Pair 5 2)と(Pair 1 10)。
ケースE:
(Id (Equal Nat 7 (Mul 2 ?)) 7)
ここで7は、の倍数ではないため、有効な答えはありません2。
これらすべての例から、いくつかの既知のパターンを識別し、特定のアルゴリズム(型推論、ブルートフォースなど)を手動で選択して答えを出す一般的なアルゴリズムを作成できることに気づきました。WolframAlphaのようなものは、積分を解きます。しかし、それはエンジニアリング/ハードコーディングされたアプローチのように聞こえます。この問題を解決する原則的な方法はありますか?調査研究/分野はありますか?