1

内置谓词 member(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 很陌生,因此将不胜感激。

4

2 回答 2

2

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

% 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).
于 2012-02-16T00:49:57.557 回答
0

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

memberDepth(X,[L|Ls],Depth) :-
    atom(L),!,                     % true iff L is an atom
    ...
memberDepth(X,[L|Ls],Depth) :-
    ...
于 2012-02-16T00:08:25.890 回答