Как рекурсивно изменить кортеж внутри списка в прологе? - PullRequest
0 голосов
/ 19 ноября 2011

У меня есть список в следующем формате:

[(index, count, color),(index+1,newcount,othercolor),...]

И я хочу, имея упорядоченный список с заданным индексом, изменить значение счетчика кортежа с этим индексом.

То, что я сделал до сих пор:

play(Index,[(Index,Count,Color)|T], [(Index,NewCount,Color)|T]):-

    NewCount is Count + 1.


play(Index,[Tuple|T],[Tuple|T]):-

    play(Index,T,T).

Это просто не дает мне ...

Есть предложения?

Спасибо за любой ответ!

Ответы [ 2 ]

0 голосов
/ 19 ноября 2011

Поскольку вы знаете, что он отсортирован, вы можете потерпеть неудачу рано, если Index нет в списке.

play(Index,[(Index,Count,Color)|T], [(Index,NewCount,Color)|T]) :-
  NewCount is Count + 1.
play(Index,[(IndexT,_,_)|_], _) :-
  Index < IndexT, !, fail.
play(Index,[Tuple|T1],[Tuple|T2]) :-
  play(Index,T1,T2).

Учитывая вышеописанную неэффективность, вас может заинтересовать возможное решение, использующее стандартные встроенные функции для манипулирования списками.

play_bt(Index, Old, New) :-
  append(Left, [(Index, Count, Color)|Rest], Old),
  NewCount is Count + 1,
  append(Left, [(Index, NewCount, Color)|Rest], New).
0 голосов
/ 19 ноября 2011

, поскольку вы хотите создать другой список, вы не можете сказать, что во втором предложении предиката будет то же самое. Вместо этого вы должны использовать новую переменную для нового хвоста. Что-то вроде:

play(Index,[(Index,Count,Color)|T], [(Index,NewCount,Color)|T]):-
    NewCount is Count + 1.


play(Index,[Tuple|T1],[Tuple|T2]):-    
    play(Index,T1,T2).                
...