Prolog反击问题

时间:2011-05-31 08:07:44

标签: prolog

我正在尝试编写一个order(List,Result)作为输入的List过程,并返回有序对的列表Result,以便:

  • 有序对的第一个元素是列表中对的位置,
  • 有序对的第二个元素是List n中相应位置的元素。

示例:

如果List = [a,b,c,d],则过程顺序(List,Result)输出列表: 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 个答案:

答案 0 :(得分:5)

这两个条款:NewCount is Count + 1increment(NewCount,Count)基本上具有相同的含义。您没有明确Count是一个输入变量,并且它具有1的基本情况,因此Prolog不知道从哪里开始统一它的值。例如,您应该使用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 :(得分:1)

如果你可以使用findall/3,那么这可能是最简单的解决方案:

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

请注意,此处的键值对使用术语-/2来表示,这就是配对通常在Prolog中表示的方式,例如:这是keysort/2所期望的。

答案 2 :(得分:0)


order(List,Result) :-
        findall((N,E),(
                    append(L0,[E|_],List),
                    length([_|L0],N)),
                Result).