Пролог: множества и операции - PullRequest
0 голосов
/ 25 апреля 2020

Я разрабатываю предикаты в прологе для манипулирования множествами. Я пытаюсь реализовать 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).

Ребята, как мне адаптировать приведенный выше код для работы с перестановками? Я пробовал разные реализации, но ни одна из них не работает.

...