开发者

Prolog Counter Problem

I am trying to write a procedure order(List,Result) that has a List as input and returns a list Result of ordered pairs such that:

  • the first element of the ordered pair is the position of the pair in the list, and
  • the second element of the ordered pair is t开发者_开发百科he element from List n the corresponding position.

Example:

if List = [a,b,c,d], the procedure order(List,Result) outputs the list: Result = [(1,a), (2,b),(3,c),(4,d)].

I am struggling with the counter for the position of the pair in the list. I have made attempts such as:

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].

Please help anyone?


The two clauses: NewCount is Count + 1 and increment(NewCount,Count) basically have the same meaning. You didn't make clear that Count is an input variable and it has a base case of 1, so Prolog didn't know where to start unifying values for it. For example, you should use Count as an input argument as follows (it doesn't change much if compared with your version):

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

order(List, Result ):- order(List, Result, 1).


If you're OK with using findall/3 then this is probably the simplest solution:

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

Note that here the key-value pairs are represented using the term -/2, which is how pairs are usually represented in Prolog, e.g. this is what keysort/2 expects.



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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜