Проблема со счетчиком пролога - PullRequest
2 голосов
/ 31 мая 2011

Я пытаюсь написать процедуру order(List,Result), которая имеет List в качестве входных данных и возвращает список Result упорядоченных пар, такой что:

  • первый элемент упорядоченной пары - это позиция пары в списке, а
  • вторым элементом упорядоченной пары является элемент из списка n соответствующей позиции.

Пример:

если List = [a,b,c,d], порядок процедур (Список, Результат) выводит список: Result = [(1,a), (2,b),(3,c),(4,d)].

Я борюсь со счетчиком за положение пары в списке. Я сделал такие попытки:

increment(Accum,Total):-
        Total is Accum + 1.
order([],[]).
order([Head|Tail],Result):-
        order(Tail, NewTail),
        NewCount is Count + 1,
        increment(NewCount,Count),
        Result = [(Count,Head)|NewTail].

Пожалуйста, помогите кому-нибудь?

Ответы [ 3 ]

5 голосов
/ 31 мая 2011

Два предложения: NewCount is Count + 1 и increment(NewCount,Count) в основном имеют одинаковое значение. Вы не пояснили, что Count является входной переменной и имеет базовый регистр 1, поэтому Пролог не знал, с чего начать объединение значений для нее. Например, вы должны использовать Count в качестве входного аргумента следующим образом (он не сильно меняется по сравнению с вашей версией):

order([],[], _).
order([Head|Tail],[(Count,Head)|NewTail], Count):-
        NewCount is Count + 1,
        order(Tail, NewTail, NewCount).

order(List, Result ):- order(List, Result, 1).
1 голос
/ 01 июня 2011

Если вы в порядке с findall/3, то это, вероятно, самое простое решение:

order(List, Result) :-
    findall(Index-Elem, nth1(Index, List, Elem), Result).

Обратите внимание, что здесь пары ключ-значение представлены с помощью термина -/2, то есть как пары обычно представлены в Прологе, например, это то, что keysort/2 ожидает.

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

order(List,Result) :-
        findall((N,E),(
                    append(L0,[E|_],List),
                    length([_|L0],N)),
                Result).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...