gpt4 book ai didi

list - 2个列表的交集和并集

转载 作者:行者123 更新时间:2023-12-04 13:53:30 28 4
gpt4 key购买 nike

我正在开始学习 prolog(我使用 SWI-prolog)并且我做了一个简单的练习,其中我有 2 个列表,我想计算它们的交集和并集。
这是我的代码运行良好,但我问自己是否有更好的方法来做到这一点,因为我不喜欢使用 CUT operator .

intersectionTR(_, [], []).
intersectionTR([], _, []).
intersectionTR([H1|T1], L2, [H1|L]):-
member(H1, L2),
intersectionTR(T1, L2, L), !.
intersectionTR([_|T1], L2, L):-
intersectionTR(T1, L2, L).

intersection(L1, L2):-
intersectionTR(L1, L2, L),
write(L).


unionTR([], [], []).
unionTR([], [H2|T2], [H2|L]):-
intersectionTR(T2, L, Res),
Res = [],
unionTR([], T2, L),
!.
unionTR([], [_|T2], L):-
unionTR([], T2, L),
!.

unionTR([H1|T1], L2, L):-
intersectionTR([H1], L, Res),
Res \= [],
unionTR(T1, L2, L).
unionTR([H1|T1], L2, [H1|L]):-
unionTR(T1, L2, L).

union(L1, L2):-
unionTR(L1, L2, L),
write(L).

请记住,我只想得到 1 个结果,而不是多个结果(即使正确),因此使用以下代码运行代码:
?- intersect([1,3,5,2,4] ,[6,1,2]).

应该退出:
[1,2]
true.

而不是与
[1,2]
true ;
[1,2]
true ;
etc...

对于联合谓词,同样必须有效。
正如我所说,我的代码运行良好,但请提出更好的方法。
谢谢

最佳答案

另外,不确定您为什么反对削减,只要根据您的链接,删除它们不会改变代码的声明性含义。例如:

inter([], _, []).

inter([H1|T1], L2, [H1|Res]) :-
member(H1, L2),
inter(T1, L2, Res).

inter([_|T1], L2, Res) :-
inter(T1, L2, Res).

test(X):-
inter([1,3,5,2,4], [6,1,2], X), !.

test(X).
X = [1, 2].

在我调用代码的测试位中,我只是说做交集,但我只对第一个答案感兴趣。谓词定义本身没有任何削减。

关于list - 2个列表的交集和并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9615002/

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