Trong Prolog, tôi thường giải quyết một vấn đề bằng cách cung cấp một khuôn mẫu (một cấu trúc chứa các biến) và sau đó thỏa mãn một tập hợp các ràng buộc trên nó. Một ví dụ nhỏ có thể là:Đáp ứng một tập hợp các mục tiêu trong Prolog
go(T) :-
T = [_, _, _],
member(cat, T),
member(dog, T),
member(mouse, T).
Và trong thực tế các tập các ràng buộc được tạo ra một cách nào đó khác hơn là cố định, và tôi phải viết một vị đệ quy để đáp ứng từng chế lần lượt:
go(T) :-
T = [_, _, _],
findall(A, animal(A), As),
% satisy member(A, T) for each A in As
fill_in_animals(T, As)
fill_in_animals(T, []).
fill_in_animals(T, [A|Rest]) :-
member(A, T),
fill_in_animals(T, Rest).
Lưu ý rằng câu hỏi của tôi không phải là về các ràng buộc liên quan đến danh sách, và thậm chí các tham số cho ràng buộc không phải lúc nào cũng dễ dàng được tạo ra như một danh sách được chuyển đến một vị từ trợ giúp tương đối đơn giản như được sử dụng ở trên. Trong thực tế, tôi tìm thấy người trợ giúp là một biến vị ngữ khá vô lý mà tôi viết mỗi lần, trong đó:
- Chấp nhận một mẫu, một số tham số được sử dụng cho ràng buộc (và do đó ràng buộc biến của mẫu với giá trị hữu ích), và một biến để chỉ ra ràng buộc nào.
- Tạo ra một ràng buộc để thỏa mãn trong lần lặp này, áp dụng nó vào mẫu.
- Đệ quy gọi chính nó để các ràng buộc còn lại có thể được thỏa mãn.
Điều tôi đang tìm kiếm là một biến vị ngữ dọc theo các dòng findall
, v.v., sẽ đáp ứng một nhóm mục tiêu, cái này theo mục tiêu khác. Một cái gì đó như:
% satisfyall(:Goal)
% backtracks on Goal but keeps all bindings from each fully satisfied goal.
satisfyall((animal(A), member(A, T)))
Câu trả lời tôi đang tìm không nhất thiết phải ở dạng này. Trong thực tế có thể có một mâu thuẫn giữa backtracking trên một mục tiêu và duy trì mỗi bộ bindings kết quả từ nó.
Tôi hy vọng tôi đã giải thích được vấn đề của mình để giải thích rõ ràng điều gì sẽ giúp ích. (Nếu không cho tôi biết.) Xin lỗi trước cho câu hỏi dài dòng!
Cập nhật (2 năm sau)
tôi sẽ thử nó ra sau ngày hôm nay và cập nhật câu hỏi của tôi!
Lưu ý rằng tôi không bao giờ nói tôi muốn cập nhật câu hỏi trong cùng một ngày như thử. ;-)
@CapelliC đã chỉ đạo cho tôi đi đúng hướng, và tôi đã tìm ra một mô hình mà có vẻ làm việc khá tốt:
?- Gs = [member(red),member(blue)], T = [_,_], foreach(member(G, Gs), call(G, T)).
T = [red, blue] ;
T = [blue, red] ;
[lambda.pl] (http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl) có thể giúp đỡ, nhưng tôi nghĩ rằng bạn nên đi với findall/3 – CapelliC
Có lý do cụ thể nào lambda không được phân phối với SWI không? Tôi rất thích có thể 'use_module (thư viện (lambda))'! –
@DanielLyons: Tôi có một số downvote khi tôi đã cố gắng trả lời câu hỏi này rất giống nhau :) – CapelliC