2012-07-10 67 views
2

我必須找到列表中給定元素的所有索引並將其作爲列表返回。因此,例如:Prolog - IndexofElement

?- indexList(a,[a,b,c,a,b],Rs). 
Rs = [0,3] 

我的想法是:

positions(E, L, P) :- positions(E, L, 0, Rs). 
positions(E, [], _, []). 
positions(E, [E|Xs], P, [P|PT]) :- P1 is P + 1, positions(E, Xs, P1, PT). 
positions(E, [X|Xs], P, PT) :- P1 is P+1, positions(E, Xs, P1, PT). 

當我跟蹤這個我得到一個列表,其中每個位置是(在最後一步之前的步驟)。但是在最後的幾步中,他以某種方式改變了它,並且返回正確。

回答

2

你的問題是,而不是使用Rs回到你正在使用P位置的列表。 你應該已經在positions/3中看到一個皮棉警告(單身變量P和Rs),應該警告你這一點。

而且,positions/4第一部分中,你應該檢查E比X不同:

positions(E, L, Rs) :- positions(E, L, 0, Rs). 
positions(E, [], _, []). 
positions(E, [E|Xs], P, [P|PT]) :- P1 is P + 1, positions(E, Xs, P1, PT). 
positions(E, [X|Xs], P, PT) :- E\=X, P1 is P+1, positions(E, Xs, P1, PT). 
2

您在第一行中犯了一個小錯誤。您正在調用positions(E, L, 0, Rs),但最後一個參數應爲P,以便與子句頭部中的最後一個具有相同名稱的參數進行綁定。所以第一行應該是這樣的:

positions(E, L, P) :- positions(E, L, 0, P). 
+1

gusbro的觀察,關於E是比X不同的檢查,只需要當你要求超過只是第一個解決方案,無論哪種情況都是正確的。試着在沒有修改的情況下運行你的代碼,看看會發生什麼。 – Mihai 2012-07-10 16:19:01