copy attribute list in get_atts
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
:- module(atts, [attribute/1, '$absent_attr'/2, '$get_attr'/2, '$put_attr'/2,
|
:- module(atts, [attribute/1, '$absent_attr'/2, '$copy_attr_list'/2,
|
||||||
'$absent_from_list'/2, '$get_from_list'/2, '$add_to_list'/2,
|
'$get_attr'/2, '$put_attr'/2, '$absent_from_list'/2,
|
||||||
'$del_attr'/3, '$del_attr_step'/2, '$del_attr_buried'/3]).
|
'$get_from_list'/2, '$add_to_list'/2, '$del_attr'/3,
|
||||||
|
'$del_attr_step'/2, '$del_attr_buried'/3]).
|
||||||
|
|
||||||
:- use_module(library(control)).
|
:- use_module(library(control)).
|
||||||
:- use_module(library(dcgs)).
|
:- use_module(library(dcgs)).
|
||||||
@@ -60,6 +61,10 @@
|
|||||||
).
|
).
|
||||||
'$del_attr_buried'(_, _, _).
|
'$del_attr_buried'(_, _, _).
|
||||||
|
|
||||||
|
'$copy_attr_list'(L, []) :- var(L), !.
|
||||||
|
'$copy_attr_list'([Att|Atts], [Att|CopiedAtts]) :-
|
||||||
|
'$copy_attr_list'(Atts, CopiedAtts).
|
||||||
|
|
||||||
user:term_expansion(Term0, Terms) :-
|
user:term_expansion(Term0, Terms) :-
|
||||||
nonvar(Term0),
|
nonvar(Term0),
|
||||||
Term0 = (:- attribute Atts),
|
Term0 = (:- attribute Atts),
|
||||||
@@ -75,13 +80,14 @@ put_attrs_var_check -->
|
|||||||
(put_atts(Var, Attr) :- var(Attr), throw(error(instantiation_error, put_atts/2)))].
|
(put_atts(Var, Attr) :- var(Attr), throw(error(instantiation_error, put_atts/2)))].
|
||||||
|
|
||||||
get_attrs_var_check -->
|
get_attrs_var_check -->
|
||||||
{ numbervars([Var, Attr], 0, _) },
|
{ numbervars([Var, Ls, Attr], 0, _) },
|
||||||
[(get_atts(Var, Attr) :- nonvar(Var), throw(error(type_error(variable, Var), get_atts/2))),
|
[(get_atts(Var, Attr) :- nonvar(Var), throw(error(type_error(variable, Var), get_atts/2))),
|
||||||
(get_atts(Var, Attr) :- var(Attr), !, '$get_attr_list'(Var, Attr))].
|
(get_atts(Var, Attr) :- var(Attr), !, '$get_attr_list'(Var, Ls), nonvar(Ls),
|
||||||
|
'$copy_attr_list'(Ls, Attr))].
|
||||||
|
|
||||||
put_attrs(Name/Arity) -->
|
put_attrs(Name/Arity) -->
|
||||||
put_attr(Name, Arity),
|
put_attr(Name, Arity),
|
||||||
{ numbervars([Var, Attr], 0, _) },
|
{ numbervars([Var, Attr], 0, _) },
|
||||||
[(put_atts(Var, Attr) :- lists:maplist(put_atts(Var), Attr))].
|
[(put_atts(Var, Attr) :- lists:maplist(put_atts(Var), Attr))].
|
||||||
put_attrs((Name/Arity, Atts)) -->
|
put_attrs((Name/Arity, Atts)) -->
|
||||||
{ nonvar(Atts) },
|
{ nonvar(Atts) },
|
||||||
|
|||||||
@@ -97,8 +97,6 @@ impl MachineState {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// from the assumptions active at the call site in bind, we know:
|
|
||||||
// if addr is a Ref, it precedes h in the heap.
|
|
||||||
fn bind_attr_var(&mut self, h: usize, addr: Addr) {
|
fn bind_attr_var(&mut self, h: usize, addr: Addr) {
|
||||||
match addr.as_var() {
|
match addr.as_var() {
|
||||||
Some(Ref::HeapCell(hc)) => {
|
Some(Ref::HeapCell(hc)) => {
|
||||||
|
|||||||
24
src/tests.rs
24
src/tests.rs
@@ -2147,33 +2147,33 @@ fn test_queries_on_attributed_variables()
|
|||||||
|
|
||||||
assert_prolog_success!(&mut wam, "?- ( put_atts(V, my_mod, dif(1)) ; put_atts(V, my_mod, dif(2)) ),
|
assert_prolog_success!(&mut wam, "?- ( put_atts(V, my_mod, dif(1)) ; put_atts(V, my_mod, dif(2)) ),
|
||||||
get_atts(V, my_mod, L).",
|
get_atts(V, my_mod, L).",
|
||||||
[["L = [dif(1) | _16]", "V = _12"],
|
[["L = [dif(1)]", "V = _12"],
|
||||||
["L = [dif(2) | _16]", "V = _12"]]);
|
["L = [dif(2)]", "V = _12"]]);
|
||||||
|
|
||||||
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, frozen(a)),
|
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, frozen(a)),
|
||||||
( put_atts(V, my_mod, dif(1))
|
( put_atts(V, my_mod, dif(1))
|
||||||
; put_atts(V, my_mod, -frozen(a)), put_atts(V, my_mod, dif(2))
|
; put_atts(V, my_mod, -frozen(a)), put_atts(V, my_mod, dif(2))
|
||||||
; put_atts(V, my_mod, dif(different)) ),
|
; put_atts(V, my_mod, dif(different)) ),
|
||||||
get_atts(V, my_mod, Ls).",
|
get_atts(V, my_mod, Ls).",
|
||||||
[["Ls = [frozen(a), dif(1) | _36]", "V = _12"],
|
[["Ls = [frozen(a), dif(1)]", "V = _12"],
|
||||||
["Ls = [dif(2) | _50]", "V = _12"],
|
["Ls = [dif(2)]", "V = _12"],
|
||||||
["Ls = [frozen(a), dif(different) | _36]", "V = _12"]]);
|
["Ls = [frozen(a), dif(different)]", "V = _12"]]);
|
||||||
|
|
||||||
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a)]),
|
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a)]),
|
||||||
( put_atts(V, my_mod, -dif(2)); put_atts(V, my_mod, -frozen(A)) ),
|
( put_atts(V, my_mod, -dif(2)); put_atts(V, my_mod, -frozen(A)) ),
|
||||||
get_atts(V, my_mod, L).",
|
get_atts(V, my_mod, L).",
|
||||||
[["A = _69", "L = [dif(1), frozen(a) | _67]", "V = _27"],
|
[["A = _69", "L = [dif(1), frozen(a)]", "V = _27"],
|
||||||
["A = _69", "L = [dif(1), dif(2) | _67]", "V = _27"]]);
|
["A = _69", "L = [dif(1), dif(2)]", "V = _27"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a)]),
|
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a)]),
|
||||||
( put_atts(V, my_mod, -dif(2)), V = f(a)
|
( put_atts(V, my_mod, -dif(2)), V = f(a)
|
||||||
; put_atts(V, my_mod, -frozen(_)), get_atts(V, my_mod, L) ).",
|
; put_atts(V, my_mod, -frozen(_)), get_atts(V, my_mod, L) ).",
|
||||||
[["L = _69", "V = f(a)"],
|
[["L = _69", "V = f(a)"],
|
||||||
["L = [dif(1), dif(2) | _67]", "V = _27"]]);
|
["L = [dif(1), dif(2)]", "V = _27"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
||||||
( put_atts(V, my_mod, -dif(2)) ; put_atts(V, my_mod, -frozen(A)) ),
|
( put_atts(V, my_mod, -dif(2)) ; put_atts(V, my_mod, -frozen(A)) ),
|
||||||
get_atts(V, my_mod, L).",
|
get_atts(V, my_mod, L).",
|
||||||
[["A = _97", "L = [dif(1), frozen(a), frozen(b) | _95]", "V = _31"],
|
[["A = _97", "L = [dif(1), frozen(a), frozen(b)]", "V = _31"],
|
||||||
["A = _97", "L = [dif(1), dif(2) | _95]", "V = _31"]]);
|
["A = _97", "L = [dif(1), dif(2)]", "V = _31"]]);
|
||||||
assert_prolog_failure!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
assert_prolog_failure!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
||||||
get_atts(V, my_mod, -dif(1)).");
|
get_atts(V, my_mod, -dif(1)).");
|
||||||
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
||||||
@@ -2184,8 +2184,8 @@ fn test_queries_on_attributed_variables()
|
|||||||
["X = 2", "V = _31"]]);
|
["X = 2", "V = _31"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
|
||||||
put_atts(V, my_mod, -dif(A)), get_atts(V, my_mod, Ls).",
|
put_atts(V, my_mod, -dif(A)), get_atts(V, my_mod, Ls).",
|
||||||
[["A = _98", "Ls = [frozen(a), frozen(b) | _95]", "V = _31"]]);
|
[["A = _98", "Ls = [frozen(a), frozen(b)]", "V = _31"]]);
|
||||||
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), frozen(a), dif(2), frozen(b)]),
|
assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), frozen(a), dif(2), frozen(b)]),
|
||||||
put_atts(V, my_mod, -dif(A)), get_atts(V, my_mod, Ls).",
|
put_atts(V, my_mod, -dif(A)), get_atts(V, my_mod, Ls).",
|
||||||
[["A = _98", "Ls = [frozen(a), frozen(b) | _95]", "V = _31"]]);
|
[["A = _98", "Ls = [frozen(a), frozen(b)]", "V = _31"]]);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user