2016-11-30 126 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