use can_be(list, _) in all solutions predicates
This commit is contained in:
@@ -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."
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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)?))
|
||||||
|
|||||||
10
src/tests.rs
10
src/tests.rs
@@ -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).",
|
||||||
|
|||||||
Reference in New Issue
Block a user