Aquí es una solución que utiliza colas y los hilos de SWI-Prolog. Utiliza la antigua API existente y hace algo a lo largo de Tarau's Engines. Supongo que la creación del hilo copiará la plantilla y el objetivo. Y luego supongo que el envío de la cola volverá a hacer una copia de cada solución.
Por lo tanto, en comparación con el clasificador clásico, tendrá un excedente en una plantilla y una copia del objetivo, pero de lo contrario también copiará cada solución como el clasificador clásico. Fuente en la esencia here. Pero por modding threadall2, lo que hace la colección, se podría también aplicar todo tipo de agregados:
% threadall(+Term, +Goal, -List)
threadall(T, G, L) :-
message_queue_create(J, [max_size(1)]),
thread_create(threadall3(T, G, J), _, [detached(true)]),
thread_get_message(J, A),
threadall2(J, A, L),
message_queue_destroy(J).
% threadall3(+Term, +Goal, +Queue)
threadall3(T, G, J) :-
G, thread_send_message(J, the(T)), fail.
threadall3(_, _, J) :-
thread_send_message(J, no).
% threadall2(+Queue, +Term, -List)
threadall2(J, the(T), [T|L]) :- !,
thread_get_message(J, A),
threadall2(J, A, L).
threadall2(_, no, []).
Aquí se muestra un ejemplo de ejecución. Espero haber hecho la contabilidad correctamente. El subproceso se creó con detach (true), por lo que no necesitamos ningún identificador cuando finaliza el subproceso.La cola de mensajes se destruye explícitamente. Éstos son algunos ejemplo se ejecuta en SWI-Prolog, vemos que funciona como se esperaba:
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.23)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
?- threadall(X, between(0, 5, X), L).
L = [0, 1, 2, 3, 4, 5].
?- threadall(X-Y, (between(0, 2, X),
threadall(Z, between(0, 2, Z), Y)), L).
L = [0-[0, 1, 2], 1-[0, 1, 2], 2-[0, 1, 2]].
Nuestro código sólo implementa el camino habitual feliz: Sólo en práctica el mensaje y the/1
no/0
. Además, dado que no usamos setup_call_cleanup/3
, tampoco es seguro utilizar la solución con interrupciones. Además, el último argumento no es firme. Todo esto queda como un ejercicio para que el lector implemente estos requisitos adicionales y las rutas alternativas correspondientes.
Posible duplicado de [SWI-Prolog: reuniendo todas las soluciones sin findall] (http://stackoverflow.com/questions/22492633/swi-prolog-gathering-all-solutions-without-findall) –
¿Te importa combinar múltiples -threading y recursividad? –