首页 > 解决方案 > 如果交集为空,则返回 True,否则返回 False

问题描述

我有一个函数可以计算序言中两个列表的交集。代码:

list_member(X,[X|_]).
list_member(X,[_|TAIL]) :- list_member(X,TAIL).

list_intersect([X|Y],Z,[X|W]) :-
   list_member(X,Z), list_intersect(Y,Z,W).
list_intersect([X|Y],Z,W) :-
   \+ list_member(X,Z), list_intersect(Y,Z,W).
list_intersect([],_,[]).

如果上述 fn 提供的交集列表为空,我想要一个返回 true 的函数,否则它应该返回 false。

代码尝试:

success_fn([X], [Y]) :-
list_intersect(X, Y, Z),
length(Z, L),
L > 0, write('False');
L < 1, write('True').

我使用的查询:

success([1,2,3,4,5,6], [1, 2, 3]).

输出每次都返回 false。

标签: prolog

解决方案


假设您有一个有效的交集谓词,测试两个集合的交集是空集是微不足道的:

intersection( [1,3,5,7,9], [2,4,6,8,10], [] ).

交集是一个集合操作(​​意味着它对唯一的集合进行操作,每个集合都没有重复的成员。[1,2,3]是一个集合;[3,2,1,2,2,3]不是一个集合。)

这是计算两个集合的交集的一种方法(sort/2除了对集合进行排序之外,还删除了重复项):

intersection( Xs, Ys, Zs ) :-      % to compute set intersection
  sort(Xs,X1),                     % - ensure the first list is an ordered set
  sort(Ys,Y1),                     % - ensure that the second list is an ordered set
  findall(Z, common(Z,X1,Y1), Zs). % - Find all Z such that Z is common to both Xs and Ys

% Z is common to Xs and Ys if it is a member of both Xs and Ys
common(Z, Xs, Ys) :- member(Z,Xs), member(Z,Ys).

推荐阅读