correct attributed variables bugs

This commit is contained in:
Mark Thom
2019-12-03 22:59:51 -07:00
parent 738ea59e23
commit 43b39538ff
3 changed files with 21 additions and 19 deletions

View File

@@ -28,19 +28,18 @@
'$get_attr_list'(V, Ls), '$get_attr_list'(V, Ls),
'$absent_from_list'(Ls, Attr). '$absent_from_list'(Ls, Attr).
'$absent_from_list'(X, _) :- '$absent_from_list'(X, Attr) :-
var(X), !. ( var(X) -> true
'$absent_from_list'([L|Ls], Attr) :- ; X = [L|Ls], L \= Attr -> '$absent_from_list'(Ls, Attr)
( L \= Attr -> '$absent_from_list'(Ls, Attr) ). ).
'$get_attr'(V, Attr) :- '$get_attr'(V, Attr) :-
'$get_attr_list'(V, Ls), nonvar(Ls), '$get_from_list'(Ls, V, Attr). '$get_attr_list'(V, Ls), nonvar(Ls), '$get_from_list'(Ls, V, Attr).
'$get_from_list'([L|Ls], V, Attr) :- '$get_from_list'([L|Ls], V, Attr) :-
nonvar(L), nonvar(L),
( L \= Attr -> nonvar(Ls), '$get_from_list'(Ls, V, Attr) ( L \= Attr -> nonvar(Ls), '$get_from_list'(Ls, V, Attr)
; L = Attr -> '$enqueue_attr_var'(V) ; L = Attr, '$enqueue_attr_var'(V)
; '$get_from_list'(Ls, V, Attr)
). ).
'$put_attr'(V, Attr) :- '$put_attr'(V, Attr) :-
@@ -67,15 +66,14 @@
%% assumptions: Ls0 is a list, Ls1 is its tail; %% assumptions: Ls0 is a list, Ls1 is its tail;
%% the head of Ls0 can be ignored. %% the head of Ls0 can be ignored.
'$del_attr_buried'(Ls0, Ls1, V, Attr) :- '$del_attr_buried'(Ls0, Ls1, V, Attr) :-
Ls0 = [_, Att | _], ( var(Ls1) -> true
nonvar(Att), ; Ls1 = [Att | Ls2] ->
!, ( Att \= Attr -> '$del_attr_buried'(Ls1, Ls2, V, Attr)
( Att \= Attr -> '$del_attr_step'(Ls1, V, Attr) ; '$enqueue_attr_var'(V),
; '$enqueue_attr_var'(V), '$del_attr_non_head'(Ls0), %% set tail of Ls0 = tail of Ls1. can be undone by backtracking.
'$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_step'(Ls1, V, Attr) )
). ).
'$del_attr_buried'(_, _, _, _).
'$copy_attr_list'(L, []) :- var(L), !. '$copy_attr_list'(L, []) :- var(L), !.
'$copy_attr_list'([Att|Atts], [Att|CopiedAtts]) :- '$copy_attr_list'([Att|Atts], [Att|CopiedAtts]) :-
@@ -125,10 +123,13 @@ put_attr(Name, Arity) -->
numbervars(Attr, 0, Arity), numbervars(Attr, 0, Arity),
V = '$VAR'(Arity) }, V = '$VAR'(Arity) },
[(put_atts(V, +Attr) :- !, functor(Attr, Head, Arity), functor(AttrForm, Head, 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), (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_atts(V, -Attr) :- !, functor(Attr, _, _), '$get_attr_list'(V, Ls), '$del_attr'(Ls, V, Attr))]. '$put_attr'(V, Attr)),
(put_atts(V, -Attr) :- !, functor(Attr, _, _), '$get_attr_list'(V, Ls),
'$del_attr'(Ls, V, Attr))].
get_attr(Name, Arity) --> get_attr(Name, Arity) -->
{ functor(Attr, Name, Arity), { functor(Attr, Name, Arity),

View File

@@ -25,3 +25,4 @@ attribute_goals(Var) -->
{ get_atts(Var, frozen(Goals)), { get_atts(Var, frozen(Goals)),
put_atts(Var, -frozen(_)) }, put_atts(Var, -frozen(_)) },
[freeze(Var, Goals)]. [freeze(Var, Goals)].

View File

@@ -50,7 +50,7 @@ call_attribute_goals([Module | Modules], GoalCaller, AttrVars) :-
call_query_var_goals([], _, []). call_query_var_goals([], _, []).
call_query_var_goals([AttrVar|AttrVars], Module, Goals) :- call_query_var_goals([AttrVar|AttrVars], Module, Goals) :-
( catch(( Module:attribute_goals(AttrVar, Goals, RGoals0) ( catch(( Module:attribute_goals(AttrVar, Goals, RGoals0)
; atts:'$default_attr_list'(Module, AttrVar, RGoals0, RGoals) , atts:'$default_attr_list'(Module, AttrVar, RGoals0, RGoals)
), ),
E, E,
( '$print_attribute_goals_exception'(Module, E), ( '$print_attribute_goals_exception'(Module, E),