我正在开始学习 prolog(我使用 SWI-prolog),我做了一个简单的练习,其中我有 2 个列表,我想计算它们的交集和并集。
这是我的代码,效果很好,但我问自己是否有更好的方法,因为我不喜欢使用剪切操作员.
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...
这对于联合谓词也必须有效。
正如我所说,我的代码运行得很好,但请建议更好的方法。
Thanks