1

組み込みの述語 member(x, List) は、メンバーがリストに存在するかどうかをチェックしますが、リスト内にリストがある場合は、最初の深さだけをチェックします。メンバーがどのくらいの深さにいるのかを正確に調べようとしています。例:

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

基本的に、リスト内の「a」の最初のインスタンスの深さを見つけます。メンバーが存在しない場合は、深さ = 0 が返されます。メンバーのすべてのインスタンスの深さを順番に見つけることができれば、それも役に立ちます。次に例を示します。

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

私はプロローグに非常に慣れていないので、助けていただければ幸いです。

4

2 に答える 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(X,[L|Ls],Depth) :-
    atom(L),!,                     % true iff L is an atom
    ...
memberDepth(X,[L|Ls],Depth) :-
    ...
于 2012-02-16T00:08:25.890 に答える