Die StreamMemo- Bibliothek für Coq zeigt, wie eine Funktion f : nat -> A
über die natürlichen Zahlen gespeichert wird . Insbesondere wenn f (S n) = g (f n)
die imemo_make
Freigabe die Berechnung von rekursiven Aufrufen teilt.
Angenommen, wir möchten anstelle natürlicher Zahlen rekursive Funktionen über Binärbäume speichern:
Inductive binTree : Set :=
| Leaf : binTree
| Branch : binTree -> binTree -> binTree.
Angenommen, wir haben eine Funktion f : binTree -> A
, die strukturell rekursiv ist, was bedeutet, dass es eine g : A -> A -> A
solche Funktion gibt f (Branch x y) = g (f x) (f y)
. Wie erstellen wir eine ähnliche Memotabelle für f
in Coq, sodass die rekursiven Berechnungen gemeinsam genutzt werden?
In Haskell ist es nicht allzu schwierig, eine solche Memotabelle (siehe beispielsweise MemoTrie ) zu erstellen und den Knoten zu knüpfen. Offensichtlich sind solche Memotabellen produktiv. Wie können wir Dinge arrangieren, um eine abhängig getippte Sprache davon zu überzeugen, dass eine solche Knotenbindung produktiv ist?
Obwohl ich das Problem in Coq angegeben habe, würde ich mich über eine Antwort in Agda oder einer anderen abhängig getippten Sprache freuen.
go
Wert eine Funktion eines Größenparameters. Im Allgemeinen gibt es keine gemeinsame Nutzung zwischen unabhängigen Funktionsaufrufen mit demselben Wert. Dies kann wahrscheinlich durch Hinzufügen einer let-Anweisung in der Definition von behoben werdenh (Branch l r)
. Zweitens bedeutet die geschichtete Definition vonBT
, dass zwei ansonsten identisch geformte Bäume unterschiedliche Werte haben, wenn sie auf unterschiedlichen Ebenen auftreten. Diese unterschiedlichen Werte werden im MemoTrie nicht geteilt.