From 2a70ca375c235cfed4a56ed7dfd459a1ff6bfde0 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Wed, 17 Feb 2021 16:18:49 -0700 Subject: [PATCH] restore support for tabling and delimited continuations (#779) --- src/forms.rs | 4 ++-- src/lib/atts.pl | 2 +- src/lib/cont.pl | 4 +++- src/lib/tabling.pl | 5 ++++- src/lib/tabling/batched_worklist.pl | 2 ++ src/lib/tabling/global_worklist.pl | 2 ++ src/lib/tabling/table_data_structure.pl | 2 ++ src/lib/tabling/table_link_manager.pl | 2 ++ src/lib/tabling/trie.pl | 2 ++ src/lib/tabling/wrapper.pl | 2 ++ src/machine/compile.rs | 2 +- 11 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/forms.rs b/src/forms.rs index 9956c058..3f0bd288 100644 --- a/src/forms.rs +++ b/src/forms.rs @@ -673,7 +673,7 @@ impl PredicateInfo { #[inline] pub fn must_retract_local_clauses(&self) -> bool { - self.is_extensible && !self.is_discontiguous + self.is_extensible && self.has_clauses && !self.is_discontiguous } } @@ -707,7 +707,7 @@ impl PredicateSkeleton { is_discontiguous: self.is_discontiguous, is_dynamic: self.is_dynamic, is_multifile: self.is_multifile, - has_clauses: !self.clauses.is_empty(), + has_clauses: !self.clause_clause_locs.is_empty(), } } diff --git a/src/lib/atts.pl b/src/lib/atts.pl index fcd5b2c1..afdebd71 100644 --- a/src/lib/atts.pl +++ b/src/lib/atts.pl @@ -108,7 +108,7 @@ get_attrs_var_check --> put_attrs(Name/Arity, Module) --> put_attr(Name, Arity, Module), - [(put_atts(Var, Attr) :- lists:maplist(put_atts(Var), Attr), !)]. + [(put_atts(Var, Attr) :- lists:maplist(Module:put_atts(Var), Attr), !)]. put_attrs((Name/Arity, Atts), Module) --> { nonvar(Atts) }, put_attr(Name, Arity, Module), diff --git a/src/lib/cont.pl b/src/lib/cont.pl index 8dccdc5e..a5125d96 100644 --- a/src/lib/cont.pl +++ b/src/lib/cont.pl @@ -1,5 +1,7 @@ :- module(cont, [reset/3, shift/1]). +:- meta_predicate reset(0, ?, ?). + reset(Goal, Ball, Cont) :- call(Goal), '$reset_cont_marker', @@ -11,7 +13,7 @@ shift(Ball) :- get_chunks(E, P, L), ( L == [] -> Cont = cont(true) - ; Cont = cont(call_continuation(L)) + ; Cont = cont(cont:call_continuation(L)) ), '$write_cont_and_term'(_, _, Cont, Ball), '$unwind_environments'. diff --git a/src/lib/tabling.pl b/src/lib/tabling.pl index 703da8e3..2163c791 100644 --- a/src/lib/tabling.pl +++ b/src/lib/tabling.pl @@ -11,9 +11,9 @@ :- use_module(library(tabling/double_linked_list)). :- use_module(library(tabling/table_data_structure)). :- use_module(library(tabling/batched_worklist)). -:- use_module(library(tabling/wrapper)). :- use_module(library(tabling/global_worklist)). :- use_module(library(tabling/table_link_manager)). +:- use_module(library(tabling/wrapper)). :- use_module(library(cont)). :- use_module(library(lists)). @@ -66,6 +66,9 @@ table_and_status_for_variant(V,T,S) :- table_for_variant(V,T), tbd_table_status(T,S). + +:- meta_predicate start_tabling(?, 0). + start_tabling(Wrapper,Worker) :- put_new_trie_table_link, put_new_global_worklist, diff --git a/src/lib/tabling/batched_worklist.pl b/src/lib/tabling/batched_worklist.pl index 99f0619b..8a8b4117 100644 --- a/src/lib/tabling/batched_worklist.pl +++ b/src/lib/tabling/batched_worklist.pl @@ -53,6 +53,8 @@ :- attribute executing_all_work/1, worklist_presence/1, wkl_answer_cluster/1, wkl_suspension_cluster/1, wkl_answer_cluster_pointer_flag/1. +verify_attributes(_, _, []). + /** Tabling Worklist management A batched worklist: a worklist that clusters suspensions and answers as diff --git a/src/lib/tabling/global_worklist.pl b/src/lib/tabling/global_worklist.pl index 19502a92..55c437f1 100644 --- a/src/lib/tabling/global_worklist.pl +++ b/src/lib/tabling/global_worklist.pl @@ -13,6 +13,8 @@ :- attribute table_global_worklist/1. +verify_attributes(_, _, []). + put_new_global_worklist :- ( bb_get(table_global_worklist_initialized, _) -> true diff --git a/src/lib/tabling/table_data_structure.pl b/src/lib/tabling/table_data_structure.pl index 0ce989da..69a057e6 100644 --- a/src/lib/tabling/table_data_structure.pl +++ b/src/lib/tabling/table_data_structure.pl @@ -61,6 +61,8 @@ :- attribute table_status/1, newly_created_table_identifiers/1. +verify_attributes(_, _, []). + % This file defines the table datastructure. % % The table datastructure contains the following sub-structures: diff --git a/src/lib/tabling/table_link_manager.pl b/src/lib/tabling/table_link_manager.pl index ec88f105..c346ea10 100644 --- a/src/lib/tabling/table_link_manager.pl +++ b/src/lib/tabling/table_link_manager.pl @@ -51,6 +51,8 @@ :- attribute trie_table_link/1. +verify_attributes(_, _, []). + % This file defines a call pattern trie. % % This data structure keeps the relation between a variant and the diff --git a/src/lib/tabling/trie.pl b/src/lib/tabling/trie.pl index 2e545524..cd855b92 100644 --- a/src/lib/tabling/trie.pl +++ b/src/lib/tabling/trie.pl @@ -47,6 +47,8 @@ :- attribute maybe_just/1, children/1. +verify_attributes(_, _, []). + % Implementation of a prefix tree, a.k.a. trie % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/lib/tabling/wrapper.pl b/src/lib/tabling/wrapper.pl index 4c902e84..d2d13901 100644 --- a/src/lib/tabling/wrapper.pl +++ b/src/lib/tabling/wrapper.pl @@ -40,6 +40,8 @@ :- use_module(library(dcgs)). :- use_module(library(error)). +:- multifile(tabled/2). + %%:- multifile %% system:term_expansion/2, %% tabled/2. diff --git a/src/machine/compile.rs b/src/machine/compile.rs index 3c7f9eb8..9364d176 100644 --- a/src/machine/compile.rs +++ b/src/machine/compile.rs @@ -1754,7 +1754,7 @@ impl<'a, TS: TermStream> Loader<'a, TS> { .map(|skeleton| skeleton.predicate_info()) .unwrap_or_default(); - if predicate_info.must_retract_local_clauses() { + if local_predicate_info.must_retract_local_clauses() { self.retract_local_clauses(&key, predicate_info.is_dynamic); } -- 2.54.0