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のようなものは、積分を解きます。しかし、それはエンジニアリング/ハードコーディングされたアプローチのように聞こえます。この問題を解決する原則的な方法はありますか?調査研究/分野はありますか?