我正在尝试编写一个order(List,Result)
作为输入的List
过程,并返回有序对的列表Result
,以便:
示例:
如果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].
请帮助任何人?
答案 0 :(得分:5)
这两个条款:NewCount is Count + 1
和increment(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).