Я разрабатываю предикаты в прологе для манипулирования множествами. Я пытаюсь реализовать 3 предиката, используя следующие встроенные предикаты: member / 2, append / 3, length / 2, permutation / 2:
1) list_to_set / 2
Предикат, который преобразует список в набор. Учитывая список Xs = [1, 2, 3, 3]
Мне нужно вернуть перестановку Xs
без дубликатов.
ВХОД
?- list_to_set([3, 1, a, a], Es).
ВЫХОД
?- Es = [1,3,a];
?- Es = [1,a,3];
?- Es = [3,1,a];
?- Es = [3,a,1];
?- Es = [a,1,3];
?- Es = [a,3,1].
2) Союз / 3
Даны два набора Xs, Rs. предикат Union(Xs, Rs, Es)
проверяет, является ли Es
объединением между наборами Xs
и Rs
.
INPUT
?- union([2,1,3,a], [4,1,3,a], Es).
OUTPUT
?- Es = [1,3,a];
?- Es = [1,a,3];
?- Es = [3,1,a];
?- Es = [3,a,1];
?- Es = [a,1,3];
?- Es = [a,3,1].
4 ) diff / 3
Учитывая два набора Xs, Rs. предикат Diff(Xs, Rs, Es)
проверяет, является ли Es
разницей между установленными Xs
и Rs
.
INPUT
?- diff([2,1,3,a], [4,1,3,a], Es).
OUTPUT
?- Es = [2, 4];
?- Es = [4, 2].
Вот что я сделал до сих пор:
%list to set predicate
list_to_set(Xs , Cs) :-
lpc(Xs, [], Cs).
lpc([], Rs, Rs).
lpc([X | Xs], Rs, Cs):-
member(X, Rs),
lpc(Xs, Rs, Cs).
lpc([X | Xs], Rs, Cs):-
lpc(Xs, [X|Rs], Cs).
%union between two sets predicate
union([], _, _).
union([C|Cs], Ds, Es) :-
member(C, Ds),
union(Cs, Ds, Es).
union([C|Cs], Ds, [C|Es]) :-
member(C, permutation(Cs, Es)),
union(Cs, Ds, Es).
diff([], _, []).
diff([C |Cs], Ds, Es):-
member(C, Ds),
diff(Cs, Ds, Es).
diff([C | Cs], Ds, [C | Es]):-
member(C, permutation(Cs, Es)),
diff(Cs, Ds, Es).
Ребята, как мне адаптировать приведенный выше код для работы с перестановками? Я пробовал разные реализации, но ни одна из них не работает.