Ở đây đi một thực hiện:
subset([], []).
subset([E|Tail], [E|NTail]):-
subset(Tail, NTail).
subset([_|Tail], NTail):-
subset(Tail, NTail).
Nó sẽ tạo ra tất cả các tập con, mặc dù không theo thứ tự hiển thị trên ví dụ của bạn.
Theo yêu cầu của người nhận xét ở đây, hãy giải thích:
Điều khoản đầu tiên là trường hợp cơ sở. Nó nói rằng danh sách trống là một tập hợp con của danh sách trống.
Điều khoản thứ hai và thứ ba đối phó với đệ quy. Mệnh đề thứ hai nói rằng nếu hai danh sách có cùng một Head và đuôi của danh sách bên phải là một tập con của đuôi của danh sách bên trái, thì danh sách bên phải là một tập hợp con của danh sách bên trái.
Điều khoản thứ ba quy định rằng nếu chúng ta bỏ qua phần đầu của danh sách bên trái và danh sách bên phải là tập con của đuôi của danh sách bên trái, thì danh sách bên phải là tập con của danh sách bên trái.
Quy trình được hiển thị ở trên tạo bộ đặt hàng. Đối với bộ có thứ tự bạn có thể sử dụng permutation/3
:
unordered_subset(Set, SubSet):-
length(Set, LSet),
between(0,LSet, LSubSet),
length(NSubSet, LSubSet),
permutation(SubSet, NSubSet),
subset(Set, NSubSet).
Bạn nên chuyển các đối số trong tập hợp con (X, Y) để chúng ta đọc X là tập hợp con của Y, không giống như bạn đã làm: Y là một tập con của X. –