]> Repositorios git - scryer-prolog.git/commitdiff
append the entire queues instead of inserting each element individually
authorMarkus Triska <[email protected]>
Tue, 15 Aug 2023 19:43:19 +0000 (21:43 +0200)
committerMarkus Triska <[email protected]>
Tue, 22 Aug 2023 19:52:55 +0000 (21:52 +0200)
src/lib/clpz.pl

index d5b461f3bb1c6e539dfcc73fa14f46a871783ba7..cd1b3f85f0dbe8b0afe33d849c26b53e4e237b63 100644 (file)
@@ -2672,13 +2672,34 @@ propagator_init_trigger(Vs, P) -->
 
 variables_same_queue(Vs0) :-
         include(var, Vs0, Vs),
-        new_queue(Q),
-        maplist(variable_queue, Vs, Qs),
-        phrase((collect_goal(Qs),
-                collect_fast(Qs),
-                collect_slow(Qs)), [Q], [Q]),
-        maplist(clear_queue, Qs),
-        maplist(=(Q), Qs).
+        (   Vs == [] -> true
+        ;   maplist(variable_queue, Vs, Qs0),
+            sort(Qs0, [Q|Qs]),
+            Q =.. [_|Args],
+            append_queues_(Qs, Args, [append,append,append,ignore]),
+            maplist(clear_queue, Qs),
+            maplist(=(Q), Qs)
+        ).
+
+append_queues_([], _, _).
+append_queues_([Q|Qs], Args0, Is) :-
+        Q =.. [_|Args],
+        maplist(append_queue, Is, Args0, Args),
+        append_queues_(Qs, Args, Is).
+
+append_queue(ignore, _, _).
+append_queue(append, Q0, Q) :-
+        (   get_atts(Q0, queue(Ls0,Ls)) ->
+            (   get_atts(Q, queue(Ms0,Ms)) ->
+                Ls = Ms0,
+                put_atts(Q0, queue(Ls0,Ms))
+            ;   true
+            )
+        ;   (   get_atts(Q, queue(Ms0,Ms)) ->
+                put_atts(Q0, queue(Ms0,Ms))
+            ;   true
+            )
+        ).
 
 clear_queue(queue(Goals,Fast,Slow,Aux)) :-
         put_atts(Goals, -queue(_,_)),
@@ -2686,22 +2707,6 @@ clear_queue(queue(Goals,Fast,Slow,Aux)) :-
         put_atts(Slow, -queue(_,_)),
         put_atts(Aux, -disabled).
 
-collect_goal(Qs) --> collect_arg(Qs, 1).
-collect_fast(Qs) --> collect_arg(Qs, 2).
-collect_slow(Qs) --> collect_arg(Qs, 3).
-
-collect_arg([], _) --> [].
-collect_arg([Q|Qs], Which) -->
-        collect_all_(Q, Which),
-        collect_arg(Qs, Which).
-
-collect_all_(Q, Which) -->
-        (   { queue_get_arg_(Q, Which, Element) } ->
-            insert_queue(Element, Which),
-            collect_all_(Q, Which)
-        ;   []
-        ).
-
 variable_queue(Var, Q) :-
         get_attr(Var, clpz, Attr),
         Attr = clpz_attr(_Left,_Right,_Spread,_Dom,_Ps,Q).