2016-11-30 125 views
1

我有這樣的數據結構的列表,其中的元素始終是唯一的:查找元素的索引中列出

[[a,b,c], [d,e,f], [y,z]] 

現在,我想編寫一個程序來得到一個元素的索引,說我有:

indexOf([[a,b,c], [d,e,f], [y,z]], a, H) 

H0。或者:

indexOf([[a,b,c], [d,e,f], [y,z]], f, H) 

H2

這是我有:

indexOf_single([X|_],X,0). 
indexOf_single([_|T],X,H) :- indexOf_single(T,X,H1), H is H1 + 1. 

indexOf([T],X,H) :- indexOf_single(T,X,H). 
indexOf([Head|Tail],X,H) :- indexOf_single(Head,X,H),indexOf(Tail,X,H). 

但我發現了false所有的時間。你能給我任何線索解決它嗎?

+0

你知道什麼失敗嗎?這兩個謂詞中的哪一個是它?你知道'nth0/3'嗎?如果你使用的是Prolog實現,你可以用它來代替你的'indexOf_single/3'。它也有可能是'nnth/3';然後使用'n(Index1,List,Element),succ(Index,Index1)'。 – 2016-11-30 10:31:06

回答

2

嘗試用

indexOf([Head|_],X,H) :- indexOf_single(Head,X,H). 
indexOf([_|Tail],X,H) :- indexOf(Tail,X,H). 

我在你indexOf/3看到兩個錯誤。

(1)你的第二個條款

​​

在你問這個HHeadTail發現(通過indexOf_single/3。當「元素總是獨一無二的」時,這是不可能的。

(2)你的第一句

indexOf([T],X,H) :- indexOf_single(T,X,H). 

在你T只有搜索如果T是第一個參數的最後一個子列表。

+0

是的工作!非常感謝。你能解釋一下你是如何做出這個改變的嗎? –

+1

@AshshinMehrabani - 答案改進;希望這可以幫助。 – max66