Tôi đang cố gắng tạo mã để tạo tất cả các tập hợp con của một tập hợp theo thứ tự. Đó là, gọi subset([1,2,3], X)
nên tạoĐộ dài của các tập hợp con đã đặt hàng?
X = [];
X = [1];
X = [2];
X = [3];
X = [1,2];
X = [1,3];
X = [2,3];
X = [1,2,3].
Trình tự nội bộ không phải là tất cả những gì quan trọng, chỉ là tập con nhỏ nhất được liệt kê đầu tiên (tức là tôi không quan tâm nếu [2,3] đến trước [1 , 2], chỉ có 1, [2] và [3] là trước [2,3]).
-
Tôi đã thử hai cách tiếp cận cho đến nay. Trước tiên, tôi đã cố gắng tự tạo vị ngữ cho mình ...
subset([], []).
subset(List, []).
subset(List, [N]) :-
member(N, List).
subset(List, [N|Rest]) :-
!,
nth0(I, List, N),
findall(E, (nth0(J, List, E), J > I), NewList),
subset2(NewList, Rest).
... nhưng nó thậm chí còn không hoạt động như dự định. Thứ hai tôi đã cố gắng làm cho các powerset (sử dụng this subset predicate) và đặt hàng với list_to_ord_set/2, nhưng tôi không thể làm cho nó hoạt động.
Trợ giúp?
Bạn không cần cắt nếu bạn sử dụng 'assign ([], []).' Thay vì quy tắc đầu tiên của bạn? Nếu bạn muốn loại bỏ các đánh giá cuối cùng mà kết quả đầu ra 'false' cho một số lý do bạn chỉ có thể trao đổi thứ tự của các quy tắc' assign' thứ hai và thứ ba. Nó thay đổi thứ tự nhưng vẫn hợp lệ theo những gì OP muốn. – Fatalize
@Fatalize: yêu cầu cắt để tránh các giải pháp trùng lặp và biến anon để chấp nhận danh sách con của Xs – CapelliC
Tôi không nhận được. Tôi có được kết quả chính xác tương tự với những thay đổi đó. Chăm sóc để cung cấp một ví dụ yêu cầu cắt và biến vô danh? – Fatalize