Coq のStreamMemoライブラリはf : nat -> A
、自然数に対して関数をメモ化する方法を示しています。特にの場合f (S n) = g (f n)
、imemo_make
は再帰呼び出しの計算を共有します。
自然数の代わりに、二分木の再帰関数をメモしたいとします:
Inductive binTree : Set :=
| Leaf : binTree
| Branch : binTree -> binTree -> binTree.
我々は機能があるとf : binTree -> A
機能があることを意味し、構造的に再帰的であるg : A -> A -> A
ことなどf (Branch x y) = g (f x) (f y)
。f
Coqで同様のメモテーブルを作成して、再帰的な計算を共有する方法を教えてください。
Haskellでは、そのようなメモテーブル(たとえば、MemoTrieを参照)と結び目を作成することはそれほど難しくありません。明らかに、このようなメモテーブルは生産的です。依存型付けされた言語がそのような結び目を受け入れることを受け入れるように納得させるように物事をどのように整理できるか?
私はCoqで問題を指定しましたが、Agdaまたは他の依存型付き言語での回答にも満足しています。
go
値はサイズパラメータの関数です。一般に、同じ値の独立した関数呼び出し間での共有はありません。これはおそらく、の定義にletステートメントを追加することで修正できh (Branch l r)
ます。第2に、層別化された定義BT
は、2つのツリー、またはその他の形が同じであるツリーが、異なるレベルで発生すると異なる値を持つことを意味します。これらの個別の値はMemoTrieで共有されません。