use can_be(list, _) in all solutions predicates

This commit is contained in:
Mark Thom
2019-03-30 10:44:49 -06:00
parent 5a30c7b9be
commit 8945bae70b
5 changed files with 15 additions and 20 deletions

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "scryer-prolog" name = "scryer-prolog"
version = "0.8.23" version = "0.8.24"
authors = ["Mark Thom <markjordanthom@gmail.com>"] authors = ["Mark Thom <markjordanthom@gmail.com>"]
repository = "https://github.com/mthom/scryer-prolog" repository = "https://github.com/mthom/scryer-prolog"
description = "A modern Prolog implementation written mostly in Rust." description = "A modern Prolog implementation written mostly in Rust."

View File

@@ -56,7 +56,7 @@ impl<'a> HCPreOrderIterator<'a> {
/* /*
* descend into the subtree where the iterator is currently parked * descend into the subtree where the iterator is currently parked
* and check that the leftmost leaf is a number, with every node * 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. * by brackets.
*/ */
fn leftmost_leaf_is_positive_number(&self) -> bool { fn leftmost_leaf_is_positive_number(&self) -> bool {

View File

@@ -376,13 +376,8 @@ throw(Ball) :- '$set_ball'(Ball), '$unwind_stack'.
truncate_lh_to(LhLength) :- '$truncate_lh_to'(LhLength). 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) :- findall(Template, Goal, Solutions) :-
check_for_compat_list(Solutions, findall/3), error:can_be(list, Solutions),
'$lh_length'(LhLength), '$lh_length'(LhLength),
'$call_with_default_policy'(catch('$iterate_find_all'(Template, Goal, Solutions, LhLength), '$call_with_default_policy'(catch('$iterate_find_all'(Template, Goal, Solutions, LhLength),
Error, Error,
@@ -399,8 +394,8 @@ findall(Template, Goal, Solutions) :-
findall(Template, Goal, Solutions0, Solutions1) :- findall(Template, Goal, Solutions0, Solutions1) :-
check_for_compat_list(Solutions0, findall/4), error:can_be(list, Solutions0),
check_for_compat_list(Solutions1, findall/4), error:can_be(list, Solutions1),
'$lh_length'(LhLength), '$lh_length'(LhLength),
'$call_with_default_policy'(catch('$iterate_find_all_diff'(Template, Goal, Solutions0, '$call_with_default_policy'(catch('$iterate_find_all_diff'(Template, Goal, Solutions0,
Solutions1, LhLength), Solutions1, LhLength),
@@ -430,7 +425,7 @@ iterate_variants([_|GroupSolutions], Ws, Solution) :-
iterate_variants(GroupSolutions, Ws, Solution). iterate_variants(GroupSolutions, Ws, Solution).
bagof(Template, Goal, Solution) :- bagof(Template, Goal, Solution) :-
check_for_compat_list(Solution, bagof/3), error:can_be(list, Solution),
term_variables(Template, TemplateVars0), term_variables(Template, TemplateVars0),
term_variables(Goal, GoalVars0), term_variables(Goal, GoalVars0),
sort(TemplateVars0, TemplateVars), sort(TemplateVars0, TemplateVars),
@@ -447,7 +442,7 @@ iterate_variants_and_sort([_|GroupSolutions], Ws, Solution) :-
iterate_variants_and_sort(GroupSolutions, Ws, Solution). iterate_variants_and_sort(GroupSolutions, Ws, Solution).
setof(Template, Goal, Solution) :- setof(Template, Goal, Solution) :-
check_for_compat_list(Solution, setof/3), error:can_be(list, Solution),
term_variables(Template, TemplateVars0), term_variables(Template, TemplateVars0),
term_variables(Goal, GoalVars0), term_variables(Goal, GoalVars0),
sort(TemplateVars0, TemplateVars), sort(TemplateVars0, TemplateVars),

View File

@@ -234,7 +234,7 @@ fn setup_qualified_import(mut terms: Vec<Box<Term>>) -> Result<UseModuleExport,
fn setup_declaration(mut terms: Vec<Box<Term>>) -> Result<Declaration, ParserError> fn setup_declaration(mut terms: Vec<Box<Term>>) -> Result<Declaration, ParserError>
{ {
let term = *terms.pop().unwrap(); let term = *terms.pop().unwrap();
match term { match term {
Term::Clause(_, name, mut terms, _) => Term::Clause(_, name, mut terms, _) =>
if name.as_str() == "op" && terms.len() == 3 { if name.as_str() == "op" && terms.len() == 3 {
@@ -405,7 +405,7 @@ impl RelationWorker {
if assume_dyn { if assume_dyn {
self.dynamic_clauses.push((term.clone(), tail)); self.dynamic_clauses.push((term.clone(), tail));
} }
Ok(term) Ok(term)
}, },
_ => _ =>
@@ -691,7 +691,7 @@ impl RelationWorker {
Ok(decl) => return Ok(TopLevel::Declaration(decl)), Ok(decl) => return Ok(TopLevel::Declaration(decl)),
_ => {} _ => {}
}; };
Ok(TopLevel::Query(self.setup_query(indices, terms, blocks_cuts)?)) Ok(TopLevel::Query(self.setup_query(indices, terms, blocks_cuts)?))
} else if name.as_str() == ":-" && terms.len() == 2 { } else if name.as_str() == ":-" && terms.len() == 2 {
Ok(TopLevel::Rule(self.setup_rule(indices, terms, blocks_cuts, true)?)) Ok(TopLevel::Rule(self.setup_rule(indices, terms, blocks_cuts, true)?))

View File

@@ -1721,7 +1721,7 @@ fn test_queries_on_builtins()
assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 2), S).", assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 2), S).",
[["S = [1, 2]", "X = _0"]]); [["S = [1, 2]", "X = _0"]]);
assert_prolog_success!(&mut wam, "?- findall(X+Y, (X = 1), S).", 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).", assert_prolog_success!(&mut wam, "?- findall(X, false, S).",
[["S = []", "X = _0"]]); [["S = []", "X = _0"]]);
assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 1), S).", 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).", assert_prolog_success!(&mut wam, "?- bagof(X, (X=Y; X=Z; Y=1), L).",
[["L = [_3, _6]", "X = _0", "Y = _3", "Z = _6"], [["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(_))."); submit(&mut wam, "a(1, f(_)). a(2, f(_)).");
assert_prolog_success!(&mut wam, "?- bagof(X, a(X, Y), L).", 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).", assert_prolog_success!(&mut wam, "?- setof(X, (X = 1 ; X = 2), S).",
[["S = [1, 2]", "X = _0"]]); [["S = [1, 2]", "X = _0"]]);
@@ -1767,7 +1767,7 @@ fn test_queries_on_builtins()
["L = [1]", "Y = 2"]]); ["L = [1]", "Y = 2"]]);
assert_prolog_success!(&mut wam, "?- setof(X, (X=Y; X=Z; Y=1), L).", assert_prolog_success!(&mut wam, "?- setof(X, (X=Y; X=Z; Y=1), L).",
[["L = [_3, _6]", "X = _0", "Y = _3", "Z = _6"], [["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_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)]).", 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"]]); [["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).", assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 2), S0, S1).",
[["S0 = [1, 2 | _11]", "S1 = _11", "X = _0"]]); [["S0 = [1, 2 | _11]", "S1 = _11", "X = _0"]]);
assert_prolog_success!(&mut wam, "?- findall(X+Y, (X = 1), S0, S1).", 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, _).", assert_prolog_success!(&mut wam, "?- findall(X, false, S, _).",
[["S = []", "X = _0"]]); [["S = []", "X = _0"]]);
assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 1), S0, S1).", assert_prolog_success!(&mut wam, "?- findall(X, (X = 1 ; X = 1), S0, S1).",