diff --git a/examples/tabling_fib.metta b/examples/tabling_fib.metta new file mode 100644 index 00000000..5747ecd6 --- /dev/null +++ b/examples/tabling_fib.metta @@ -0,0 +1,10 @@ +!(import! &self (library lib_tabling)) + +!(tabled (fib $N)) +(= (fib $N) + (if (< $N 2) + $N + (+ (fib (- $N 1)) + (fib (- $N 2))))) + +!(test (fib 30) 832040) diff --git a/lib/lib_tabling.metta b/lib/lib_tabling.metta new file mode 100644 index 00000000..c680f4c9 --- /dev/null +++ b/lib/lib_tabling.metta @@ -0,0 +1,11 @@ +(= (injectPrologCode $code) + (progn (translatePredicate (open_string $code $S)) + (translatePredicate (load_files user ((Predicate (stream $S))))) + True)) + +(: tabled (-> Expression Atom)) +(= (tabled $call) + (progn (translatePredicate (atom_string (car-atom $call) $strname)) + (translatePredicate (atom_string (+ 1 (length (cdr-atom $call))) $strarity)) + (translatePredicate (atomics_to_string (":- table " $strname "/" $strarity ".") $code)) + (injectPrologCode $code)))