Đây là một giải pháp mà sử dụng hàng đợi SWI-Prolog và chủ đề. Nó sử dụng API hiện có cũ và thực hiện điều gì đó dọc theo Tarau's Engines. Tôi cho rằng việc tạo luồng sẽ sao chép mẫu và mục tiêu. Và sau đó tôi giả định rằng việc gửi hàng đợi một lần nữa sẽ làm một bản sao của mỗi giải pháp.
Vì vậy, so với tìm kiếm cổ điển, bạn sẽ có thặng dư trên một mẫu và bản sao mục tiêu, nhưng nếu không nó cũng sẽ sao chép từng giải pháp như tìm kiếm cổ điển. Nguồn trên gist here. Nhưng bằng cách sửa đổi threadall2, bộ sưu tập nào, cũng có thể triển khai tất cả các loại tập hợp:
% 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, []).
Đây là một ví dụ. Tôi hy vọng tôi đã thực hiện việc kế toán một cách chính xác. Các chủ đề đã được tạo ra với tách (đúng), vì vậy chúng tôi không cần xử lý một số khi các chủ đề chấm dứt.Hàng đợi tin nhắn bị phá hủy rõ ràng. Dưới đây là một số ví dụ chạy trong SWI-Prolog, chúng ta thấy rằng nó hoạt động như mong đợi:
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]].
Mã của chúng tôi chỉ thực hiện con đường hạnh phúc thông thường: Chúng tôi chỉ triển khai thông báo the/1
và no/0
. Hơn nữa kể từ khi chúng tôi không sử dụng setup_call_cleanup/3
nó cũng không an toàn để sử dụng các giải pháp với ngắt. Ngoài ra đối số cuối cùng cũng không kiên định. Tất cả điều này được để lại như một bài tập để người đọc thực hiện các yêu cầu bổ sung này và các đường dẫn thay thế tương ứng.
Bản sao có thể có của [SWI-Prolog: thu thập tất cả các giải pháp mà không tìm thấy] (http://stackoverflow.com/questions/22492633/swi-prolog-gathering-all-solutions-without-findall) –
Bạn có nhớ kết hợp đa -threading và đệ quy? –