为什么列表 [1] 没有包含在答案 P = [[]] 中?序言

Num*_*123 5 prolog

我正在学习 Prolog,但在学习数据库操作时遇到了这个问题。当我问 Prolog 解释器时:

 findall(X,subset(X,[1]),P).
Run Code Online (Sandbox Code Playgroud)

唯一的子集是

P = [[]].
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

sla*_*ago 4

在 SWI-Prolog 中,谓词subset/2定义为:

% subset(+SubSet, +Set)

subset([], _) :- !.
subset([E|R], Set) :-
    memberchk(E, Set),
    subset(R, Set).
Run Code Online (Sandbox Code Playgroud)

为了获得所需的结果,您可以使用以下替代定义:

% sub_set(?SubSet, +Set)

sub_set([], []).
sub_set(SubSet, [_|Set]) :- sub_set(SubSet, Set).
sub_set([X|SubSet], [X|Set]) :- sub_set(SubSet, Set).

Run Code Online (Sandbox Code Playgroud)

例子:

?- 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]].
Run Code Online (Sandbox Code Playgroud)