Найти элемент списка в другом списке в Прологе - PullRequest
0 голосов
/ 03 мая 2011

Я пытаюсь решить проблему со списками, но не могу ...: (

ИГРОК (КОМАНДА, [ИГРОКИ, КОТОРЫЕ ИГРАЮТ В ЭТУ КОМАНДУ]).

player(milan,[seedorf,zambrotta,gattuso]).
player(inter,[seedorf,ronaldo,zambrotta]).
player(realmadrid,[seedorf,zidane,ronaldo]).

и я пытаюсь написать предикаты, которые возвращают 2 списка; P1 и P2 ...

find(P1,P2).

Например; если моя цель:

find([milan,inter],X). returns X:[seedorf,zambrotta]. 
                     players who played juventus and also inter 
find([inter,realmadrid],X). returns X:[seedorf,ronaldo]  
                    players who played inter and also realmadrid
find(X,[seedorf]). returns X:[juventus,inter,realmadrid]
                     teams that seedorf played
find(X,[seedorf,ronaldo]). returns X:[inter,realmadrid]
                     teams that seedorf and ronaldo played.

Я пытаюсь решить эту проблему, но я не могу пойти дальше этого (и этого даже недостаточно, чтобы попытаться найти членов списка P2 в фактах об игроке :(): БОЛЬШЕ Я НЕ МОГУ ИСПОЛЬЗОВАТЬ «!» Из-за ограничений лекций.

find(P1,[P2|P2s]):-findall(X,player(X,P2),P1),find(P1,P2s).

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

1 Ответ

0 голосов
/ 03 мая 2011

Поскольку вы принимаете и P1, и P2 в качестве входных данных, я предлагаю разбить как P1, так и P2 по их структурам для выполнения рекурсии. Одним из решений может быть поиск всей команды определенного игрока и поиск всех игроков, играющих за определенную команду:

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

find2(L, [P]) :- findall(X, (player(X, Y), member(P, Y)), L).
find2(L, [P|Ps]) :- findall(X, (player(X, Y), member(P, Y)), L0), find2(L1, Ps), intersection(L0, L1, L).

find(X, Y) :- is_list(X), find1(X, Y).
find(X, Y) :- is_list(Y), find2(X, Y).

Надеюсь, это вам как-то поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...