Как мне сделать рекурсивный список, который проверяет рейтинг компании? - PullRequest
0 голосов
/ 09 января 2011

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

В настоящее время у меня есть следующее:

isOrder([]).
isOrder([COM1,COM2|T]) :-
    rank(COM1,D), rank(COM2,E),
    D<E,
    print("in order"),
    isOrder([COM2|T]).

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

Кто-нибудь может мне помочь? Я только начал пролог, и мое понимание этого сильно ограничено. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

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

Проблема в том, что в вашей программе нет регистра для одноэлементного списка: первый регистр обрабатывает пустой список, а второй - только список с двумя или более элементами.

Вам понадобитсядобавить пункт

isOrder([_]).
0 голосов
/ 09 января 2011

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

Здесь я думаю, что вы хотите изменить базовый случай с isOrder ([]) на isOrder ([_]), или, возможно, иметь оба из них.

Первое предложение, которое у вас есть, похоже, вернет true для пустого списка, что, я думаю, не повредит. Но второе предложение никогда не может уменьшить непустой список до пустого. Он применяется только к списку, в котором есть как минимум два элемента (компании), и сводит такой случай к списку, в котором есть хотя бы один элемент.

Итак, добавьте еще одно предложение isOrder ([_]), в котором говорится, что вы добились успеха, если в списке только один элемент, и дайте нам знать, как он работает!

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