0

これで問題が発生しました。入力した場合のようにターゲット位置のリストを作成したい

?- extractIndices([5,6,7,8,9,5,6],6,List).

戻るはずです

List = [1,6]

これにより、そのリストのすべての位置が6になります。私はこのようなコードを書きました:

extractIndices(List , Item, [Index | Indecis]) :- 
    indexOf(List , Item, Index).

indexOf([Item | _], Item, 0).
indexOf([_ |Tail], Item, Index):-
    indexOf(Tail, Item, Index1),
    Index is Index1+1.

そしてこれは私に与えます

?- extractIndices([5,6,7,8,9,5,6],6,L).
L = [1|_G2870] ;
L = [6|_G2870] ;
false.

誰かが私がこれを修正するのを手伝ってくれるなら、それはとてもありがたいです...ありがとう。

4

2 に答える 2

1

に2つのルールを指定しましindexOfた。1つはリストの先頭を処理して末尾を無視し、もう1つは末尾を処理して先頭を無視します。これにより、示されているように、クエリに対して2つの異なるソリューションが得られます。

述語nth0を使用して、位置をリスト内の項目にマップできます。

それを使用する最も簡単な方法は次のようになりますfindall

extractIndices(List , Item, Indices) :-
     findall(N, nth0(N, List, Item), Indices).

のようなものを使用して独自のソリューションを作成することもできますindexOf。ただし、おそらく2つの異なるルールを提供する必要があります。1つはベースケース(通常は空のリスト)用で、もう1つはヘッドでそれを解決してからテールで再度呼び出す再帰ケースです。indexOf

于 2012-12-05T20:54:30.410 に答える
1

私はEdmundと同じコード(つまり、findall + nth0)を使用しますが、学習目的でコードを修正することを示す価値があります。

extractIndices(List , Item, Indices) :- 
    indexOf(List, Item, 0, Indices).

indexOf([X|Items], Item, I, Is) :-
    ( X == Item -> Is = [I|Rs] ; Is = Rs ),
    J is I + 1,
    indexOf(Items, Item, J, Rs).
indexOf([], _, _, []).

テスト:

?- extractIndices([5,6,7,8,9,5,6],6,L).
L = [1, 6].
于 2012-12-05T21:06:00.747 に答える