prolog - 为什么列表 [1] 不包含在答案 P = [[]] 中?序言
问题描述
我正在学习 Prolog,但在学习数据库操作时遇到了这个问题。当我问 Prolog 解释器时:
findall(X,subset(X,[1]),P).
唯一的子集是
P = [[]].
为什么是这样?
解决方案
在 SWI-Prolog 中,谓词subset/2
定义为:
% subset(+SubSet, +Set)
subset([], _) :- !.
subset([E|R], Set) :-
memberchk(E, Set),
subset(R, Set).
要获得所需的结果,您可以使用以下替代定义:
% sub_set(?SubSet, +Set)
sub_set([], []).
sub_set(SubSet, [_|Set]) :- sub_set(SubSet, Set).
sub_set([X|SubSet], [X|Set]) :- sub_set(SubSet, Set).
例子:
?- sub_set(S,[a,b,c]).
S = [] ;
S = [c] ;
S = [b] ;
S = [b, c] ;
S = [a] ;
S = [a, c] ;
S = [a, b] ;
S = [a, b, c] ;
false.
?- sub_set([a,c],[a,b,c]).
true ;
false.
?- findall(SubSet, sub_set(SubSet,[1]), PowerSet).
PowerSet = [[], [1]].
推荐阅读
- bootstrap-4 - 在移动视图中将导航项更改为手风琴
- javascript - 节点 mqtt 服务器不传播发布
- vuejs2 - 在 vue.js 客户端合并来自不同 graphql 解析器的数据以进行简单输出
- c# - 比较 C# 中的两条路径。何时使用区分大小写?
- r - as_datetime() 错误:所有格式都无法解析
- r - 三组散点图中的平均值±SE
- javascript - 等到所有 Observables 完成
- c++ - 如何在没有中间限制的情况下定义与 STL 兼容的输入迭代器?
- python - “ValuesViewHDF5”对象不可下标
- apache-kafka - 如何将单消息转换与 Kafka Connect JDBC 源连接器和多个表一起使用?