2

リスト内の特定の要素のすべてのインデックスを検索し、それをリストとして返す必要があります。したがって、たとえば:

?- indexList(a,[a,b,c,a,b],Rs).
Rs = [0,3]

私の考えは:

positions( E, L, P ) :- positions( E, L, 0, Rs ).
positions( E, [], _, [] ).
positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ).
positions( E, [X|Xs], P, PT ) :-  P1 is P+1, positions( E, Xs, P1, PT ).

これをトレースすると、すべてのポジションが含まれているリストが表示されます(最後のステップの前のステップ)。しかし、最後のステップで、彼はどういうわけかそれを変更し、ちょうどtrueを返します。

4

2 に答える 2

2

最初の行で小さな間違いをしました。を呼び出していますが、句の先頭から同じ名前の最後のパラメーターでバインディングを作成するには、positions(E, L, 0, Rs)最後のパラメーターをである必要があります。Pしたがって、最初の行は次のようになります。

positions(E, L, P) :- positions(E, L, 0, P).
于 2012-07-10T16:10:00.960 に答える
2

問題は、を使用する代わりに、使用Rsしているポジションのリストを返すことですP。これを警告するはずのlint警告(シングルトン変数PおよびRs)が表示されpositions/3ているはずです。

また、3番目の節でpositions/4、EがXと異なることを確認する必要があります。

positions( E, L, Rs ) :- positions( E, L, 0, Rs ).
positions( E, [], _, [] ).
positions( E, [E|Xs], P, [P|PT] ) :- P1 is P + 1, positions( E, Xs, P1, PT ).
positions( E, [X|Xs], P, PT ) :-  E\=X, P1 is P+1, positions( E, Xs, P1, PT ).
于 2012-07-10T16:10:26.457 に答える