From: bakaq Date: Wed, 20 Sep 2023 23:56:04 +0000 (-0300) Subject: Improved dif/2 X-Git-Tag: remove~93^2~3 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=a64a765f32af532a3d3211a6d832a08c6d9dd9cf;p=scryer-prolog.git Improved dif/2 --- diff --git a/src/lib/dif.pl b/src/lib/dif.pl index 73d65518..4fe35b80 100644 --- a/src/lib/dif.pl +++ b/src/lib/dif.pl @@ -7,7 +7,7 @@ arguments are different terms. :- use_module(library(atts)). :- use_module(library(dcgs)). -:- use_module(library(lists), [append/3]). +:- use_module(library(lists), [append/3, maplist/3]). :- attribute dif/1. @@ -23,6 +23,29 @@ dif_set_variables([Var|Vars], X, Y) :- put_dif_att(Var, X, Y), dif_set_variables(Vars, X, Y). +remove_goal([], _, []). +remove_goal([G0|G0s], Goal0, Goals) :- + ( G0 == Goal0 -> + remove_goal(G0s, Goal0, Goals) + ; Goals = [G0|Goals1], + remove_goal(G0s, Goal0, Goals1) + ). + +vars_remove_goal([], _). +vars_remove_goal([Var|Vars], Goal0) :- + get_atts(Var, +dif(Goals0)), + remove_goal(Goals0, Goal0, Goals), + put_atts(Var, +dif(Goals)), + vars_remove_goal(Vars, Goal0). + +reinforce_goal(Goal0, Goal) :- + Goal = ( + term_variables(Goal0, Vars), + dif:vars_remove_goal(Vars, Goal0), + Goal0 = (L \== R), + dif(L, R) + ). + append_goals([], _). append_goals([Var|Vars], Goals) :- ( get_atts(Var, +dif(VarGoals)) -> @@ -34,9 +57,10 @@ append_goals([Var|Vars], Goals) :- append_goals(Vars, Goals). verify_attributes(Var, Value, Goals) :- - ( get_atts(Var, +dif(Goals)) -> + ( get_atts(Var, +dif(Goals0)) -> term_variables(Value, ValueVars), - append_goals(ValueVars, Goals) + append_goals(ValueVars, Goals0), + maplist(reinforce_goal, Goals0, Goals) ; Goals = [] ).