From 8a3a79de3ccc0ce40d1cb0fc4ff7ee776928df9c Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 3 Feb 2019 16:10:12 -0700 Subject: [PATCH] copy attribute list in get_atts --- src/prolog/lib/atts.pl | 18 ++++++++++++------ src/prolog/machine/machine_state_impl.rs | 2 -- src/tests.rs | 24 ++++++++++++------------ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/prolog/lib/atts.pl b/src/prolog/lib/atts.pl index 036b2318..b2d845d4 100644 --- a/src/prolog/lib/atts.pl +++ b/src/prolog/lib/atts.pl @@ -1,6 +1,7 @@ -:- module(atts, [attribute/1, '$absent_attr'/2, '$get_attr'/2, '$put_attr'/2, - '$absent_from_list'/2, '$get_from_list'/2, '$add_to_list'/2, - '$del_attr'/3, '$del_attr_step'/2, '$del_attr_buried'/3]). +:- module(atts, [attribute/1, '$absent_attr'/2, '$copy_attr_list'/2, + '$get_attr'/2, '$put_attr'/2, '$absent_from_list'/2, + '$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(dcgs)). @@ -60,6 +61,10 @@ ). '$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) :- nonvar(Term0), Term0 = (:- attribute Atts), @@ -75,13 +80,14 @@ put_attrs_var_check --> (put_atts(Var, Attr) :- var(Attr), throw(error(instantiation_error, put_atts/2)))]. 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) :- 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_attr(Name, Arity), - { numbervars([Var, Attr], 0, _) }, + { numbervars([Var, Attr], 0, _) }, [(put_atts(Var, Attr) :- lists:maplist(put_atts(Var), Attr))]. put_attrs((Name/Arity, Atts)) --> { nonvar(Atts) }, diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index 6c1374bf..a6a59f1f 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -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) { match addr.as_var() { Some(Ref::HeapCell(hc)) => { diff --git a/src/tests.rs b/src/tests.rs index 646e8f9b..637192cb 100644 --- a/src/tests.rs +++ b/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)) ), get_atts(V, my_mod, L).", - [["L = [dif(1) | _16]", "V = _12"], - ["L = [dif(2) | _16]", "V = _12"]]); + [["L = [dif(1)]", "V = _12"], + ["L = [dif(2)]", "V = _12"]]); assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, frozen(a)), ( 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, dif(different)) ), get_atts(V, my_mod, Ls).", - [["Ls = [frozen(a), dif(1) | _36]", "V = _12"], - ["Ls = [dif(2) | _50]", "V = _12"], - ["Ls = [frozen(a), dif(different) | _36]", "V = _12"]]); + [["Ls = [frozen(a), dif(1)]", "V = _12"], + ["Ls = [dif(2)]", "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)]), ( put_atts(V, my_mod, -dif(2)); put_atts(V, my_mod, -frozen(A)) ), get_atts(V, my_mod, L).", - [["A = _69", "L = [dif(1), frozen(a) | _67]", "V = _27"], - ["A = _69", "L = [dif(1), dif(2) | _67]", "V = _27"]]); + [["A = _69", "L = [dif(1), frozen(a)]", "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)]), ( put_atts(V, my_mod, -dif(2)), V = f(a) ; put_atts(V, my_mod, -frozen(_)), get_atts(V, my_mod, L) ).", [["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)]), ( put_atts(V, my_mod, -dif(2)) ; put_atts(V, my_mod, -frozen(A)) ), get_atts(V, my_mod, L).", - [["A = _97", "L = [dif(1), frozen(a), frozen(b) | _95]", "V = _31"], - ["A = _97", "L = [dif(1), dif(2) | _95]", "V = _31"]]); + [["A = _97", "L = [dif(1), frozen(a), frozen(b)]", "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)]), 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)]), @@ -2184,8 +2184,8 @@ fn test_queries_on_attributed_variables() ["X = 2", "V = _31"]]); 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).", - [["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)]), 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"]]); } -- 2.54.0