2010-12-07 77 views
7

我開始與序言玩,並與Java後臺這對我來說真的很難所以這裏是一個愚蠢的問題:如何計算列表中元素的索引?

,你會怎麼寫能夠給一個給定的元素的索引在一個給定的的indexOf謂詞列表?

我的第一個問題是關於謂語元數:我想應該是3,如:

indexOf(List,Element, Index) :- ...... 

我說得對不對?可能這已經存在於內置庫中,但我想學習如何編寫它。謝謝你的幫助。

+0

看起來像一個良好的開端。 – aschepler 2010-12-07 20:20:17

+0

@aschepler是的,但我越來越瘋狂有這個小謂詞工作! – 2010-12-07 20:39:15

回答

11

您可以遞歸做到這一點:假設以0指數(否則只在第一條與1改變0)

indexOf([Element|_], Element, 0). % We found the element 
indexOf([_|Tail], Element, Index):- 
    indexOf(Tail, Element, Index1), % Check in the tail of the list 
    Index is Index1+1. % and increment the resulting index 

如果你想才發現首次亮相,你可以添加一個切(!)以避免回溯。

indexOf([Element|_], Element, 0):- !. 
indexOf([_|Tail], Element, Index):- 
    indexOf(Tail, Element, Index1), 
    !, 
    Index is Index1+1. 
1

每個人都應該喜歡用尾遞歸:

indexOf(V, [H|T], A, I) 
:- 
    Value = H, A = I, ! 
; 
    ANew is A + 1, 
    indexOf(V, T, ANew, I) 
. 

indexOf(Value, List, Index) 
:- 
    indexOf(Value, List, 0, Index) 
. 

indexOfWithoutFailure(Value, List, Index) 
:- 
    indexOf(Value, List, 0, Index) 
; 
    Index = -1 
. 

一些示例查詢:

?- indexOf(d, [a, b, c, d, e, f], Index). 
Index = 3. 

?- indexOf(x, [a, b, c, d, e, f], Index). 
false. 

?- indexOfWithoutFailure(x, [a, b, c, d, e, f], Index). 
Index = -1. 

如果你想獲得一個元素的所有索引列表中,你應該爲它寫另一個謂詞,而不用名爲allIndexesOf的剪輯或其他東西。

0

我的繼任者加註而取得這一點,這是相當簡潔利落:

index([V|_],V,0). 
index([_|T],V,s(I)) :- index(T,V,I). 

樣本輸出:

?- index([a,b,c,a],a,X). 
X = 0 ; 
X = s(s(s(0))) ; 
false. 

?- index(List,a,s(0)). 
List = [_G1710, a|_G1714].