我開始與序言玩,並與Java後臺這對我來說真的很難所以這裏是一個愚蠢的問題:如何計算列表中元素的索引?
,你會怎麼寫能夠給一個給定的元素的索引在一個給定的的indexOf謂詞列表?
我的第一個問題是關於謂語元數:我想應該是3,如:
indexOf(List,Element, Index) :- ......
我說得對不對?可能這已經存在於內置庫中,但我想學習如何編寫它。謝謝你的幫助。
我開始與序言玩,並與Java後臺這對我來說真的很難所以這裏是一個愚蠢的問題:如何計算列表中元素的索引?
,你會怎麼寫能夠給一個給定的元素的索引在一個給定的的indexOf謂詞列表?
我的第一個問題是關於謂語元數:我想應該是3,如:
indexOf(List,Element, Index) :- ......
我說得對不對?可能這已經存在於內置庫中,但我想學習如何編寫它。謝謝你的幫助。
您可以遞歸做到這一點:假設以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.
每個人都應該喜歡用尾遞歸:
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的剪輯或其他東西。
我的繼任者加註而取得這一點,這是相當簡潔利落:
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].
看起來像一個良好的開端。 – aschepler 2010-12-07 20:20:17
@aschepler是的,但我越來越瘋狂有這個小謂詞工作! – 2010-12-07 20:39:15