gpt4 book ai didi

list - Prolog:将列表拆分为两个列表(唯一项/重复项)

转载 作者:行者123 更新时间:2023-12-04 21:53:08 24 4
gpt4 key购买 nike

我一直在尝试将给定的列表拆分为两个不同的列表:Unique 和 Duplicate。
例如,如果我们有列表 [1, 1, 2, 3, 3, 4, 5]我希望唯一列表为 [2, 4, 5]和重复为 [1, 3] .
我不希望列表中的所有 1 都在重复列表中。我只需要其中之一。
我现在拥有的代码:

compareL([_|[]], Unique, Dup).    
compareL([X3,Y3 | Tail], [X3 | Unique], Dup) :-
X3 =\= Y3,
compareL([Y3 | Tail], Unique, Dup).
compareL([X3,Y3 | Tail], Unique, [X3 | Dup]) :-
X3 = Y3,
skipDups(X3, Tail, Unique, Dup).

skipDups(_, [], Unique, Dup).
skipDups(X3,[Y3 | Tail], Unique, Dup) :-
X3 =\= Y3,
compareL([Y3 | Tail], Unique, Dup).
skipDups(X3,[Y3 | Tail], Unique, Dup) :-
X3 = Y3,
skipDups(X3, Tail, Unique, Dup).

如果我运行 compareL([1, 1, 2, 3, 3, 4, 5], Unique, Dup).,则使用上面给出的示例列表我得到:
Unique = [2, 4|_G1954],
Dup = [1, 3|_G1948].

我不明白为什么在两个列表的末尾我都得到 ' _G1954 ' 和 ' _G1948 '。任何帮助,将不胜感激。谢谢。

最佳答案

我们可以保存通过建立在 if_/3 , (=)/3 , 和 tpartition/4 !

list_uniqs_dups([],[],[]).
list_uniqs_dups([X|Xs0],Us0,Ds0) :-
tpartition(=(X),Xs0,Es,Xs),
if_(Es=[],
Us0+Ds0=[X|Us]+Ds,
Ds0+Us0=[X|Ds]+Us),
list_uniqs_dups(Xs,Us,Ds).

这是OP给出的查询:
?- list_uniqs_dups([1,1,2,3,3,4,5],Us,Ds).
Ds = [1,3], Us = [2,4,5]. % succeeds deterministically

好的!以下相当普遍的查询怎么样?

?- list_uniqs_dups([],Us,Ds)。
Ds = [],我们 = []。

?- list_uniqs_dups([A],Us,Ds)。
Ds = [],我们 = [A]。

?- list_uniqs_dups([A,B],Us,Ds)。
Ds = [B], 我们 = [] , A=B
; Ds = [] , Us = [A,B], dif(A,B)。

?- list_uniqs_dups([A,B,C],Us,Ds)。
Ds = [C], 我们 = [] , A=B , B=C
; Ds = [B],我们 = [C],A=B,dif(B,C)
; Ds = [C],我们 = [B],A=C,dif(B,C)
; Ds = [C], Us = [A] , dif(A,C), B=C
; Ds = [] , Us = [A,B,C], dif(A,B), dif(A,C), dif(B,C)。

关于list - Prolog:将列表拆分为两个列表(唯一项/重复项),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15850183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com