]> Repositorios git - scryer-prolog.git/commitdiff
correct attributed variables bugs
authorMark Thom <[email protected]>
Wed, 4 Dec 2019 05:59:51 +0000 (22:59 -0700)
committerMark Thom <[email protected]>
Wed, 4 Dec 2019 05:59:51 +0000 (22:59 -0700)
src/prolog/lib/atts.pl
src/prolog/lib/freeze.pl
src/prolog/machine/project_attributes.pl

index 75d01ed5adf5712c8391c340ca0ea47f73ec78f5..15d563138b298ee907b23d3acae8af198914d5fb 100644 (file)
     '$get_attr_list'(V, Ls),
     '$absent_from_list'(Ls, Attr).
 
-'$absent_from_list'(X, _) :-
-    var(X), !.
-'$absent_from_list'([L|Ls], Attr) :-
-    ( L \= Attr -> '$absent_from_list'(Ls, Attr) ).
+'$absent_from_list'(X, Attr) :-
+    (  var(X) -> true
+    ;  X = [L|Ls], L \= Attr -> '$absent_from_list'(Ls, Attr)
+    ).
 
 '$get_attr'(V, Attr) :-
     '$get_attr_list'(V, Ls), nonvar(Ls), '$get_from_list'(Ls, V, Attr).
 
 '$get_from_list'([L|Ls], V, Attr) :-
     nonvar(L),
-    ( L \= Attr -> nonvar(Ls), '$get_from_list'(Ls, V, Attr)
-    ; L = Attr -> '$enqueue_attr_var'(V)
-    ; '$get_from_list'(Ls, V, Attr)
+    (  L \= Attr -> nonvar(Ls), '$get_from_list'(Ls, V, Attr)
+    ;  L = Attr, '$enqueue_attr_var'(V)
     ).
 
 '$put_attr'(V, Attr) :-
 %% assumptions: Ls0 is a list, Ls1 is its tail;
 %%              the head of Ls0 can be ignored.
 '$del_attr_buried'(Ls0, Ls1, V, Attr) :-
-    Ls0 = [_, Att | _],
-    nonvar(Att),
-    !,
-    ( Att \= Attr -> '$del_attr_step'(Ls1, V, Attr)
-    ; '$enqueue_attr_var'(V),
-      '$del_attr_non_head'(Ls0), %% set tail of Ls0 = tail of Ls1. can be undone by backtracking.
-      '$del_attr_step'(Ls1, V, Attr)
+    (  var(Ls1) -> true
+    ;  Ls1 = [Att | Ls2] ->
+       (  Att \= Attr -> '$del_attr_buried'(Ls1, Ls2, V, Attr)
+       ;  '$enqueue_attr_var'(V),
+         '$del_attr_non_head'(Ls0), %% set tail of Ls0 = tail of Ls1. can be undone by backtracking.
+         '$del_attr_step'(Ls1, V, Attr)
+       )
     ).
-'$del_attr_buried'(_, _, _, _).
 
 '$copy_attr_list'(L, []) :- var(L), !.
 '$copy_attr_list'([Att|Atts], [Att|CopiedAtts]) :-
@@ -125,10 +123,13 @@ put_attr(Name, Arity) -->
       numbervars(Attr, 0, Arity),
       V = '$VAR'(Arity) },
     [(put_atts(V, +Attr) :- !, functor(Attr, Head, Arity), functor(AttrForm, Head, Arity),
-                           '$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm), '$put_attr'(V, Attr)),
+                           '$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm),
+                           '$put_attr'(V, Attr)),
      (put_atts(V,  Attr) :- !, functor(Attr, Head, Arity), functor(AttrForm, Head, Arity),
-                           '$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm), '$put_attr'(V, Attr)),
-     (put_atts(V, -Attr) :- !, functor(Attr, _, _), '$get_attr_list'(V, Ls), '$del_attr'(Ls, V, Attr))].
+                           '$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm), 
+                           '$put_attr'(V, Attr)),
+     (put_atts(V, -Attr) :- !, functor(Attr, _, _), '$get_attr_list'(V, Ls), 
+                           '$del_attr'(Ls, V, Attr))].
 
 get_attr(Name, Arity) -->
     { functor(Attr, Name, Arity),
index 2fae597679203a135c5749efdcbe90a30023e640..8ab1de9b048ac5fc67b9d5b19d542696c0cdfee1 100644 (file)
@@ -25,3 +25,4 @@ attribute_goals(Var) -->
     { get_atts(Var, frozen(Goals)),
       put_atts(Var, -frozen(_)) },
     [freeze(Var, Goals)].
+
index 1c0690d5a76cbccda306f01f33b8a044cd70465d..ac851b2b9dc4a37a69ead0404f941d0175e58632 100644 (file)
@@ -50,7 +50,7 @@ call_attribute_goals([Module | Modules], GoalCaller, AttrVars) :-
 call_query_var_goals([], _, []).
 call_query_var_goals([AttrVar|AttrVars], Module, Goals) :-
     (  catch((  Module:attribute_goals(AttrVar, Goals, RGoals0)
-            ;  atts:'$default_attr_list'(Module, AttrVar, RGoals0, RGoals)
+            ,  atts:'$default_attr_list'(Module, AttrVar, RGoals0, RGoals)
             ),
             E,
             (  '$print_attribute_goals_exception'(Module, E),