如何从序言中的列表中删除反向重复列表?
我是新手学习序言的新手,我想实现以下谓词。
removereverse([[1,5],[5,1],[2,3],[3,2]],List). ---> Input
what I want:
List = [[1,5],[2,3]].
真皮
removes([],[]).
removes([[N1,N2]|T],[[N1,N2]|New]):-
\+member([N1,N2],New),
removes(T,New).
I'm new to learn the prolog, I want to fulfill the predicate below.
removereverse([[1,5],[5,1],[2,3],[3,2]],List). ---> Input
what I want:
List = [[1,5],[2,3]].
mycode
removes([],[]).
removes([[N1,N2]|T],[[N1,N2]|New]):-
\+member([N1,N2],New),
removes(T,New).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
像这样的东西吗?
首先,我们定义一个谓词来告诉我们列表中的列表中的列表是否重复。如果列表或其反向列表存在于目标列表列表中,则将列表视为重复项:
然后我们可以说:
保留找到的最后一个“重复项”并丢弃源列表中它们之前的列表。要保留第一个这样的“重复”,只需更改递归发生的位置:
另一种方法使用辅助谓词:
这保留第一个:
要保留最后一个,只需将
duplicate(X,Ts)
更改为重复(X,Xs)
。前者检查累加器Ts
中是否存在X
;后者检查源列表尾部是否存在X
(Xs
)。Something like this?
First, lets define a predicate to tell us if a list is duplicated within a list-of-lists. This counts a list as a duplicate if either it or its reverse exists in the target list-of-lists:
Then we can say:
That keeps the last "duplicate" found and discard those preceding them in the source list. To keep the first such "duplicate" instead, just change where the recursion occurs:
Another approach uses a helper predicate:
This keeps the first:
To keep the last, simply change
duplicate(X,Ts)
toduplicate(X,Xs)
. The former checks to see ifX
exists in the accumulatorTs
; the latter checks to see ifX
exists in the tail of the source list (Xs
).