From: Markus Triska Date: Sun, 26 Apr 2020 19:37:24 +0000 (+0200) Subject: add more information about tabling X-Git-Tag: v0.8.123~108^2^2~1 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=fb812e6335bac7d8328886af859ab98437575a41;p=scryer-prolog.git add more information about tabling --- diff --git a/README.md b/README.md index 337b5407..d822f769 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,40 @@ only the standard predicate `(=)/2` is used. Definite clause grammars as provided by `library(dcgs)` are ideally suited for reasoning about strings. +### Tabling (SLG resolution) + +One of the foremost attractions of Prolog is that logical consequences +of pure programs can be derived by various execution strategies +that differ regarding essential properties such as termination, +completeness and efficiency. + +The default execution strategy of Prolog is depth-first search with +chronological backtracking. This strategy is very efficient. Its main +drawback is that it is *incomplete*: It may fail to find any solution +even if one exists. + +Scryer Prolog supports an alternative execution strategy which is +called *tabling* and also known as tabled execution and +SLG resolution. To enable tabled execution for a predicate, use +[`library(tabling)`](src/prolog/lib/tabling.pl) and add a `(table)/1` +directive for the desired predicate indicator. For example, if we +write: + +``` +:- use_module(library(tabling)). +:- table a/0. + +a :- a. +``` + +Then the query `?- a.` *terminates* (and fails), whereas it +does not terminate with the default execution strategy. + +Scryer Prolog implements tabling via *delimited continuations* as +described in [*Tabling as a Library with Delimited +Control*](https://biblio.ugent.be/publication/6880648/file/6885145.pdf) +by Desouter et. al. + ### Modules Scryer has a simple predicate-based module system. It provides a