2017-05-08 77 views
0

我想返回特定元素所在的嵌套列表的深度级别或数量。同样作为条件,该列表没有重复的元素。我想,我有两个主要的疑虑了解此解决方案:Prolog获取嵌套列表的数量+ 1,其中元素是一个列表

profundidad([],_,0):-!. 
profundidad([A],A,1):-!. 
profundidad([A|_],A,1):-!. 
profundidad([H|_],A,N):- 
    profundidad(H,A,R),N is R+1. 
profundidad([_|X],A,N):- 
    profundidad(X,A,N),!. 

正确的输出将是:

profundidad([2,3,4,5,[[6]],10],6,X). 
X = 3 

首先,我们为什么把切割操作!从1-3个陈述?我知道它会阻止编译器在找到解决方案时考虑后面的语句。 二,我们如何能够阅读自然语言中的第四和第五种情况?

元素A的当列表由头部H和其余_分裂的深度,等于步数R加1。

profundidad([H|_],A,N):- 
    profundidad(H,A,R),N is R+1. 

而那些两个句子我认为它们是同以前的,但前进到列表:

profundidad([_|X],A,N):- 
    profundidad(X,A,N),!. 

另外,我现在怀疑,为什么不把[]为递归调用:

profundidad(X,A,N),!. 

我认为这是深入嵌套列表,但我不确定。 谢谢。

回答

0

最好避免切割时尽可能在以下重写和简化测试H\=A使三个条款析取

profundidad([A|_],A,1). 
profundidad([H|_],A,N):- 
    % H\=A, 
    profundidad(H,A,R), 
    N is R+1. 
profundidad([H|T],A,N):- 
    H\=A, 
    profundidad(T,A,N). 

第二条款并不需要测试,因为它下降的水平在列表中,这意味着当它是一个列表它会成功,再不能与目标元素反正统一。为了清晰起见,它可以保持在那里 - 它没有伤害。

如果您的Prolog有dif/2,您可以使用它来代替(\ =)/ 2,具体取决于您对解决方案的一般性(WRT变量实例化)的要求。

+0

谢谢CapelliC帮助我解决这个问题。我试图弄清楚什么是\ =操作符,它看起来像不是(A = B),所以它就像你说的那样是分离的。我认为第一种情况是微不足道的,当我们达到与外部清单相同水平的数字时;第二种方法深入到嵌套列表中,第三种方法是在外部列表中前进,因为传递的A和实际的H是不同的。不管我怎么努力:H = A,profundidad(H,A,R),因为奇怪的是,如果你问H不是A,那么在递归调用中使用H! – Enoy

+0

我试图在答案中解释为什么测试是可选的。很明显,如果'profundidad(H,A,R)'成功,'H' **必须是一个列表。这有帮助吗? – CapelliC

+0

是的,它有帮助,因为它表明H需要成为一个列表,而不是与请求的答案进行比较。 – Enoy

相关问题