gpt4 book ai didi

list - 在序言中合并两个列表

转载 作者:行者123 更新时间:2023-12-04 13:22:57 24 4
gpt4 key购买 nike

我需要对结果中没有重复元素的两个列表求和(即并集)。例如:

?- union([3,4,c,5], [7,f,c,3], X).
X = [3, 4, c, 5, 7, f].

基本思想似乎是获取列表 A 的每个元素,并在这样做的同时将它们添加到输出中。
列表 A 为空后,遍历列表 B,只添加那些也不在列表 A 中的元素。
到目前为止,我所拥有的是:

union([],[],[]).
union(List1,[],List1).
union([Head1|Tail1],List2,[Head1|Output]):-
union(Head1,List2,Output).

这个谓词将
使用空列表调用它时会导致空列表,
使用空 List2 和
调用它时导致 List1使用列表递归将所有 List1 元素传递到输出。
我遇到的问题是检查 List2 的元素是否也在 List1 中。

我的尝试:

union(List1, [Head2|Tail2], [Head2|Output]):-
not(member(Head2,List1)), union(List1,Tail2,Output).
union(List1, [Head2|Tail2], Output):-
member(Head2,List1), union(List1,Tail2,Output).

这没有得出正确的答案。我认为这是因为当程序到达

not(member(Head2,List1))  

此时 List1 将因

而为空
union([Head1|Tail1],List2,[Head1|Output]):- 
union(Head1,List2,Output).

这意味着 List2 的所有元素都附加到输出中。
如果在我开始检查时 List1 为空,我将如何检查 List2 的元素是否不在 List1 中?或者是否有其他解决方案来解决整个问题?

最佳答案

好吧,联合中元素的顺序似乎并不重要,所以我稍微更改了代码:

union([],[],[]).
union(List1,[],List1).
union(List1, [Head2|Tail2], [Head2|Output]):-
\+(member(Head2,List1)), union(List1,Tail2,Output).
union(List1, [Head2|Tail2], Output):-
member(Head2,List1), union(List1,Tail2,Output).

这个谓词将遍历 List2,将所有不在 List1 中的元素附加到输出,一旦 List2 为空,将把整个 List1 附加到输出。
在这种情况下:

?- union([3,4,c,5], [7,f,c,3], X).

会得到我

X = [7, f, 3, 4, c, 5].

这没关系,因为顺序在作业中并不重要。

关于list - 在序言中合并两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46899153/

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