prolog - 如果交集为空,则返回 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。
解决方案
假设您有一个有效的交集谓词,测试两个集合的交集是空集是微不足道的:
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).
推荐阅读
- android - .NET Core Web API 推送到 Apple/Android 推送通知服务器
- jquery - 使用选择下拉菜单在选项卡之间切换
- react-native - 标题标题不显示
- printing - 媒体打印在 Safari 上显示白页
- c++ - 如何在 QSplashScreen 中禁用鼠标单击
- ruby-on-rails - 没有得到具体的答案
- php - 如果没有包含已删除产品的行,则无法显示包含有关 woocommerce 产品信息的 mysql wpdb 表;也无法对 html 表格进行分页
- threat-model - 如何在 Microsoft 威胁建模工具中表示 Azure Function?
- arrays - 在 Swift 中收集和随机化数据
- outlook - Outlook 插件:Office 2016 桌面客户端:SCRIPT5022:Office.js 尚未完全加载