prolog - 在保留顺序的同时删除重复项,Prolog
问题描述
removeDup([],[]).
removeDup([H|T],T1) :- member(H,T), removeDup(T,T1).
removeDup([H|T],T1) :- not(member(H,T)), removeDup(T,Q), append(T1,[H],Q).
这会删除重复项,但会更改顺序。对于追加,我希望将 H 添加到 T1 的末尾,然后设置为 Q。
我怎样才能保留订单?
预期行为:
?- removeDup([1,2,3,2,4,5],X).
X = [1,2,3,4,5]
解决方案
rmdup(Xs, Ys) :- rmdup1(Xs, Ys, []).
这Zs
是列表中非重复元素的累加器。如果X
在 中Zs
,则忽略它,否则将其推送到列表中。
rmdup1([], Ys, Zs) :- reverse(Ys, Zs).
rmdup1([X|Xs], Ys, Zs) :-
member(X, Zs) -> rmdup1(Xs, Ys, Zs);
rmdup1(Xs, Ys, [X|Zs]).
推荐阅读
- javascript - 画布文本未全部显示
- actions-on-google - 是否有用于智能家居操作的开/关传感器
- angular - 如何使函数返回 Observable?
- sql - 计算 ED(急诊科)就诊次数,但每 8 天只有一次
- java - Gradle reimport 不断重置我的 intellij 项目 java 级别
- java - 如何以及在哪里安装 java 7?
- javascript - 从 fetch 获取数据时使用状态变量进行 React-native
- swift - 在 Swift 中的 UserDefaults 中存储日期
- json - 在 null 上调用了方法“[]”。接收者:null 尝试调用:[](0) !我在这里做错了什么?
- mysql - MySQL - 你如何重写它以使用 ONLY_FULL_GROUP_BY