如何在prolog列表中查找成员的深度?

时间:2012-02-15 23:55:32

标签: list prolog depth

内置谓词成员(x,List)检查列表中是否存在成员,但当列表中有列表时,它仅检查第一个深度。我试图找出一个成员的确切深度。例如:

?- memberDepth(a, [b, c, [d], [[e, f, [], [g], a], j], [k]], Depth).
Depth = 3 .

基本上,它在列表中找到'a'的第一个实例的深度。如果该成员不存在,它将返回Depth = 0.如果我能按顺序找到该成员的所有实例的深度也是有用的,例如:

?- memberDepthAll(a, [b, c, [a], [[e], a], [[a]]], Depth).
Depth = 2 ;
Depth = 2 ;
Depth = 3 ;
Depth = 0 ;
false.

我对prolog很新,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

请注意,如果在任何时候第二个参数不是列表,则所有规则都不匹配。此外,您可以使用成员在顶层检查,但由于我们必须分解列表以进一步深入,我会单独检查每个元素,这样可以避免重复工作或需要辅助谓词。

% First, check the first element of the list
memberDepth(X,[X|_],0).
% Next search inside the first element of the list (hence the +1)
memberDepth(X,[H|_],D1) :- memberDepth(X,H,D), D1 is D+1.
% FInally, search the rest of the list
memberDepth(X,[_|T],D) :- memberDepth(X,T,D).

答案 1 :(得分:0)

你应该通过检查列表中的每个元素来处理它是否是原子。
如果是这样,检查它是否等于'a',否则,它可能是一个列表,递归调用“memberDepth”。 /> 更多关于原子here

memberDepth(X,[L|Ls],Depth) :-
    atom(L),!,                     % true iff L is an atom
    ...
memberDepth(X,[L|Ls],Depth) :-
    ...