Создание списков не включает дубликаты в Прологе - PullRequest
0 голосов
/ 11 мая 2011
**FACTS**
player(milan,[seedorf,zambrotta,gattuso]).
player(inter,[seedorf,ronaldo,zambrotta]).
player(realmadrid,[seedorf,zidane,ronaldo]).

я хочу создать предикат такой, что:

find (TEAM, PLAYERS)

, и если моя цель найти (X, Y) , он вернет список команд, X иСписок игроков, Y, без каких-либо дубликатов ... Как показано ниже:

X=[milan], Y=[seedorf,zambrotta,gattuso];
X=[inter], Y=[seedorf,ronaldo,zambrotta];
X=[realmadrid], Y=[seedorf,zidane,ronaldo]; 
X=[milan,inter] Y=[seedorf,zambrotta];
X=[milan,realmadri] Y=[seedorf]; 
...
X=[milan,inter,realmadrid] Y=[seedorf];
... 

Я пытаюсь сделать это с, но это выдает «ОШИБКА: вне локального стека», если я не использую предикат remove_dups,Список команд, "X", будет содержать дубликаты, и программа не сможет остановиться ... продолжайте, как X = [милан, милан, милан, милан, интер] .... Как я могу исправить этот код.?:

find([X], Y) :- player(X1, Y),remove_dups(X1,X).
find([X|Xs], Y) :- player(X1, Y0),find(Xs, Y3), intersection(Y0, Y3, Y),remove_dups(X1,X).

remove_dups([],[]).
remove_dups([First|Rest],NewRest):-member(First, Rest),remove_dups(Rest, NewRest).
remove_dups([First|Rest],[First|NewRest]):-not(member(First, Rest)),remove_dups(Rest, NewRest).

Большое спасибо ...

1 Ответ

1 голос
/ 11 мая 2011

Когда вы выполняете сопоставление с шаблоном в списке Xs, он всегда вставляет одно и то же значение milan, поэтому возникает много повторений. Вы можете избежать этого, сначала гарантировав отсутствие дублирования в списке Xs и найдя соответствующих игроков:

subset([], []).
subset(Xs, [_|Ys]) :- subset(Xs, Ys).
subset([X|Xs], [X|Ys]) :- subset(Xs, Ys).

allteams(Ts) :- findall(T, player(T, _), Ts).
teams(T) :- allteams(Ts), subset(T, Ts).

find1([T], L) :- player(T, L).
find1([T|Ts], L) :- player(T, L0), find1(Ts, L1), intersection(L0, L1, L).

find(X, Y) :- teams(X), find1(X, Y).

Здесь я сначала нахожу набор всех команд и пытаюсь найти подмножества, удовлетворяющие условию.

...