如何在序言中递归地更改列表内的元组?

发布于 2024-12-17 03:46:20 字数 396 浏览 0 评论 0原文

我有一个以下格式的列表:

[(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).

它只是没有给我......

任何建议?

感谢您的任何答复!

I have a list in the following format:

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

And I want, having an ordered list with an index given, change the count value of the tuple with that index.

What I've done so far is:

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

    NewCount is Count + 1.


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

    play(Index,T,T).

It just gives me no...

Any suggestions?

Thanx for any answer!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

来日方长 2024-12-24 03:46:20

由于您想创建一个不同的列表,因此您不能说谓词的第二个子句将相同。相反,您应该为新尾部使用新变量。像这样的东西:

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


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

since you want to create a different list, you cannot say at the second clause of the predicate will be the same. Instead, you should use a new variable for the new tail. Something like:

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


play(Index,[Tuple|T1],[Tuple|T2]):-    
    play(Index,T1,T2).                
满意归宿 2024-12-24 03:46:20

因为您知道它已排序,所以如果索引不在列表中,您可能会提前失败。

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).

Because you know it's sorted, you can fail early in case Index is not in the list.

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).

Allowing the inefficiency above, you could be interested in a possible solution that uses standard builtins for list manipulation.

play_bt(Index, Old, New) :-
  append(Left, [(Index, Count, Color)|Rest], Old),
  NewCount is Count + 1,
  append(Left, [(Index, NewCount, Color)|Rest], New).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文