From 8945bae70bc22afe31f63eefc02ea1eb13d5aae1 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sat, 30 Mar 2019 10:44:49 -0600 Subject: [PATCH] use can_be(list, _) in all solutions predicates --- Cargo.toml | 2 +- src/prolog/heap_print.rs | 2 +- src/prolog/lib/builtins.pl | 15 +++++---------- src/prolog/machine/toplevel.rs | 6 +++--- src/tests.rs | 10 +++++----- 5 files changed, 15 insertions(+), 20 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fa7e8243..a5b3a0bf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scryer-prolog" -version = "0.8.23" +version = "0.8.24" authors = ["Mark Thom "] repository = "https://github.com/mthom/scryer-prolog" description = "A modern Prolog implementation written mostly in Rust." diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index d13aa8e9..dbef0a53 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -56,7 +56,7 @@ impl<'a> HCPreOrderIterator<'a> { /* * descend into the subtree where the iterator is currently parked * and check that the leftmost leaf is a number, with every node - * encountered on the way an infix or postfix operator, and not blocked + * encountered on the way an infix or postfix operator, unblocked * by brackets. */ fn leftmost_leaf_is_positive_number(&self) -> bool { diff --git a/src/prolog/lib/builtins.pl b/src/prolog/lib/builtins.pl index e612dd8e..ce95a256 100644 --- a/src/prolog/lib/builtins.pl +++ b/src/prolog/lib/builtins.pl @@ -376,13 +376,8 @@ throw(Ball) :- '$set_ball'(Ball), '$unwind_stack'. truncate_lh_to(LhLength) :- '$truncate_lh_to'(LhLength). -check_for_compat_list(L, PI) :- - ( nonvar(L), L \= [_|_], throw(error(type_error(list, L), PI)) - ; true - ). - findall(Template, Goal, Solutions) :- - check_for_compat_list(Solutions, findall/3), + error:can_be(list, Solutions), '$lh_length'(LhLength), '$call_with_default_policy'(catch('$iterate_find_all'(Template, Goal, Solutions, LhLength), Error, @@ -399,8 +394,8 @@ findall(Template, Goal, Solutions) :- findall(Template, Goal, Solutions0, Solutions1) :- - check_for_compat_list(Solutions0, findall/4), - check_for_compat_list(Solutions1, findall/4), + error:can_be(list, Solutions0), + error:can_be(list, Solutions1), '$lh_length'(LhLength), '$call_with_default_policy'(catch('$iterate_find_all_diff'(Template, Goal, Solutions0, Solutions1, LhLength), @@ -430,7 +425,7 @@ iterate_variants([_|GroupSolutions], Ws, Solution) :- iterate_variants(GroupSolutions, Ws, Solution). bagof(Template, Goal, Solution) :- - check_for_compat_list(Solution, bagof/3), + error:can_be(list, Solution), term_variables(Template, TemplateVars0), term_variables(Goal, GoalVars0), sort(TemplateVars0, TemplateVars), @@ -447,7 +442,7 @@ iterate_variants_and_sort([_|GroupSolutions], Ws, Solution) :- iterate_variants_and_sort(GroupSolutions, Ws, Solution). setof(Template, Goal, Solution) :- - check_for_compat_list(Solution, setof/3), + error:can_be(list, Solution), term_variables(Template, TemplateVars0), term_variables(Goal, GoalVars0), sort(TemplateVars0, TemplateVars), diff --git a/src/prolog/machine/toplevel.rs b/src/prolog/machine/toplevel.rs index c956cd8a..cb1efed0 100644 --- a/src/prolog/machine/toplevel.rs +++ b/src/prolog/machine/toplevel.rs @@ -234,7 +234,7 @@ fn setup_qualified_import(mut terms: Vec>) -> Result>) -> Result { let term = *terms.pop().unwrap(); - + match term { Term::Clause(_, name, mut terms, _) => if name.as_str() == "op" && terms.len() == 3 { @@ -405,7 +405,7 @@ impl RelationWorker { if assume_dyn { self.dynamic_clauses.push((term.clone(), tail)); } - + Ok(term) }, _ => @@ -691,7 +691,7 @@ impl RelationWorker { Ok(decl) => return Ok(TopLevel::Declaration(decl)), _ => {} }; - + Ok(TopLevel::Query(self.setup_query(indices, terms, blocks_cuts)?)) } else if name.as_str() == ":-" && terms.len() == 2 { Ok(TopLevel::Rule(self.setup_rule(indices, terms, blocks_cuts, true)?)) diff --git a/src/tests.rs b/src/tests.rs index a470bfd7..e854f153 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1721,7 +1721,7 @@ fn test_queries_on_builtins() assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 2), S).", [["S = [1, 2]", "X = _0"]]); assert_prolog_success!(&mut wam, "?- findall(X+Y, (X = 1), S).", - [["S = [1+_33]", "X = _1", "Y = _2"]]); + [["S = [1+_36]", "X = _1", "Y = _2"]]); assert_prolog_success!(&mut wam, "?- findall(X, false, S).", [["S = []", "X = _0"]]); assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 1), S).", @@ -1750,12 +1750,12 @@ fn test_queries_on_builtins() assert_prolog_success!(&mut wam, "?- bagof(X, (X=Y; X=Z; Y=1), L).", [["L = [_3, _6]", "X = _0", "Y = _3", "Z = _6"], - ["L = [_178]", "X = _0", "Y = 1", "Z = _6"]]); + ["L = [_184]", "X = _0", "Y = 1", "Z = _6"]]); submit(&mut wam, "a(1, f(_)). a(2, f(_))."); assert_prolog_success!(&mut wam, "?- bagof(X, a(X, Y), L).", - [["L = [1, 2]", "X = _0", "Y = f(_144)"]]); + [["L = [1, 2]", "X = _0", "Y = f(_150)"]]); assert_prolog_success!(&mut wam, "?- setof(X, (X = 1 ; X = 2), S).", [["S = [1, 2]", "X = _0"]]); @@ -1767,7 +1767,7 @@ fn test_queries_on_builtins() ["L = [1]", "Y = 2"]]); assert_prolog_success!(&mut wam, "?- setof(X, (X=Y; X=Z; Y=1), L).", [["L = [_3, _6]", "X = _0", "Y = _3", "Z = _6"], - ["L = [_178]", "X = _0", "Y = 1", "Z = _6"]]); + ["L = [_184]", "X = _0", "Y = 1", "Z = _6"]]); assert_prolog_failure!(&mut wam, "?- setof(X, member(X, [f(U,b),f(V,c)]), [f(a,c),f(a,b)])."); assert_prolog_success!(&mut wam, "?- setof(X, member(X, [f(U,b),f(V,c)]), [f(a,b),f(a,c)]).", [["U = a", "V = a", "X = _0"]]); @@ -1779,7 +1779,7 @@ fn test_queries_on_builtins() assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 2), S0, S1).", [["S0 = [1, 2 | _11]", "S1 = _11", "X = _0"]]); assert_prolog_success!(&mut wam, "?- findall(X+Y, (X = 1), S0, S1).", - [["S0 = [1+_38 | _7]", "S1 = _7", "X = _1", "Y = _2"]]); + [["S0 = [1+_44 | _7]", "S1 = _7", "X = _1", "Y = _2"]]); assert_prolog_success!(&mut wam, "?- findall(X, false, S, _).", [["S = []", "X = _0"]]); assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 1), S0, S1).", -- 2.54.0