См. этот вопрос для очень похожей проблемы.
Исходя из того, что вы говорите, вам может быть лучше составить список, а затем отсортировать его.Таким образом, вы бы знали, что список в порядке.Конечно, сложно в том, что вы сортируете по групповым разрядам, а не по алфавитному порядку их названий.
Но вопрос, который вы задали, заключается в том, как проверить список в отсортированном порядке, поэтому давайте сделаем это.
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).