Добавление списка прологов - PullRequest
0 голосов
/ 12 января 2011

- вопрос отредактирован -

Используя эти данные, мне нужно создать список:

team(milan,1).
team(napoli,2).
team(lazio,3).
team(roma,4).
team(inter,4).
team(juventus,5).

Итак, с помощью запроса типа:

check([milan,lazio,roma,inter]).

создайте новый список с соответствующим номером команды.

X=[1,3,4,4]

Я пытаюсь создать список,добавляя элементы по одному за раз.

check([H|T]) :-
 team(H,R),
 append([R],_, X),
 check(T).

Может ли кто-нибудь помочь мне завершить это?

Ответы [ 3 ]

1 голос
/ 12 января 2011

Вам необходимо найти все номера команд, для которых название команды участник из списка названий команд, которые вас интересуют:

?- findall(Number, (
                   team(Name, Number),
                   member(Name, [milan, lazio, roma, inter])), Numbers).
Numbers = [1, 3, 4, 4].

Чтобы вернуть числа в указанном порядке, просто примените member/2 до team/2, в этом случае member/2 генерирует имена (в указанном порядке), а team/2 сопоставляет их с числами:

?- findall(Number, (
                   member(Name, [lazio, milan, inter]),
                   team(Name, Number)), Numbers).
Numbers = [3, 1, 4].
0 голосов
/ 12 января 2011

Много времени с тех пор, как я использовал Пролог, но ответ - более или менее - выглядел бы так:

check([]) :- true.
check([X]) :- team(X,_).
check([X,Y]) :- team(X,N), team(Y,M), N < M.
check([X,Y|T]) :- check(X,Y), check([Y|T]).
0 голосов
/ 12 января 2011

См. этот вопрос для очень похожей проблемы.

Исходя из того, что вы говорите, вам может быть лучше составить список, а затем отсортировать его.Таким образом, вы бы знали, что список в порядке.Конечно, сложно в том, что вы сортируете по групповым разрядам, а не по алфавитному порядку их названий.

Но вопрос, который вы задали, заключается в том, как проверить список в отсортированном порядке, поэтому давайте сделаем это.

check([ ]).   % just in case an empty list is supplied  
check([_]).   % singleton lists are also in sort order  
check([H1,H2|T]) :-  
    team(H1,R1),  
    team(H2,R2),  
    R1 <= R2,  
    check([H2|T]).  

Обратите внимание, что рекурсия сокращает списки, по крайней мере, двумя элементами на один, поэтому обычным случаем завершения будет переход к списку длиной один.Это единственная сложная часть этой проверки.

Добавлено в ответ на редактирование комментария / вопроса:

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

mapTeamRank([ ],[ ]).  % image of empty list is empty  
mapTeamRank([H|T],[R|S]) :-  
    team(H,R),
    mapTeamRank(T,S).

Итак, теперь у вас есть предикат, который превратит список команд LT в соответствующий список рангов LR, и вы можете «проверить» это для отсортированного порядка, вызвав msort(LR,LR):

check(LT) :-
    mapTeamRank(LT,LR),
    msort(LR,LR).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...