2011-05-31 46 views
2

我試圖寫具有List作爲輸入並返回有序對的列表Result過程order(List,Result)使得:Prolog的計數器問題

  • 有序對的第一個元素是一對的位置在列表中,並且
  • 有序對的第二個元素是List 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]. 

請幫助任何人嗎?

回答

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). 
0

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

如果你使用findall/3 OK那麼這可能是最簡單的辦法:

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

注意,這裏的鍵值對使用期限-/2,這是如何對通常的Prolog的代表表示,如這是keysort/2期望的。