From: Mark Thom Date: Wed, 4 Dec 2019 05:59:51 +0000 (-0700) Subject: correct attributed variables bugs X-Git-Tag: v0.8.118~36^2~4 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=43b39538ff05690b2988ea62dd2e9c9bf1bd6431;p=scryer-prolog.git correct attributed variables bugs --- diff --git a/src/prolog/lib/atts.pl b/src/prolog/lib/atts.pl index 75d01ed5..15d56313 100644 --- a/src/prolog/lib/atts.pl +++ b/src/prolog/lib/atts.pl @@ -28,19 +28,18 @@ '$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) :- @@ -67,15 +66,14 @@ %% 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), diff --git a/src/prolog/lib/freeze.pl b/src/prolog/lib/freeze.pl index 2fae5976..8ab1de9b 100644 --- a/src/prolog/lib/freeze.pl +++ b/src/prolog/lib/freeze.pl @@ -25,3 +25,4 @@ attribute_goals(Var) --> { get_atts(Var, frozen(Goals)), put_atts(Var, -frozen(_)) }, [freeze(Var, Goals)]. + diff --git a/src/prolog/machine/project_attributes.pl b/src/prolog/machine/project_attributes.pl index 1c0690d5..ac851b2b 100644 --- a/src/prolog/machine/project_attributes.pl +++ b/src/prolog/machine/project_attributes.pl @@ -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),