The StreamMemo perpustakaan untuk Coq menggambarkan bagaimana memoize fungsi f : nat -> A
melalui nomor alami. Terutama saat f (S n) = g (f n)
, imemo_make
berbagi perhitungan panggilan rekursif.
Misalkan alih-alih bilangan alami, kami ingin memoize fungsi rekursif atas pohon biner:
Inductive binTree : Set :=
| Leaf : binTree
| Branch : binTree -> binTree -> binTree.
Misalkan kita memiliki fungsi f : binTree -> A
yang bersifat rekursif secara struktural, artinya ada fungsi g : A -> A -> A
sedemikian rupa f (Branch x y) = g (f x) (f y)
. Bagaimana kita membuat tabel memo serupa untuk f
dalam Coq sehingga perhitungan rekursif dibagikan?
Di Haskell, tidak terlalu sulit untuk membuat tabel memo seperti itu (lihat MemoTrie misalnya) dan mengikat. Jelas tabel memo seperti itu produktif. Bagaimana kita bisa mengatur hal-hal untuk meyakinkan bahasa yang diketik secara dependen untuk menerima ikatan seperti itu produktif?
Meskipun saya telah menentukan masalah dalam Coq, saya akan senang dengan jawaban dalam Agda atau bahasa yang diketik dengan dependen lainnya.
go
nilainya adalah fungsi dari parameter Ukuran. Secara umum, tidak ada pembagian antara panggilan fungsi independen pada nilai yang sama. Ini mungkin dapat diperbaiki dengan menambahkan pernyataan let dalam definisih (Branch l r)
. Kedua, definisi bertingkat yangBT
berarti bahwa dua pohon, jika tidak identik bentuknya, akan memiliki nilai yang berbeda ketika mereka muncul di tingkat yang berbeda. Nilai-nilai berbeda ini tidak akan dibagikan di MemoTrie.