List Prolog-如果列表的元素是空列表,则返回false

List Prolog-如果列表的元素是空列表,则返回false,list,prolog,prolog-dif,List,Prolog,Prolog Dif,我希望确保列表不包含空列表,但我的尝试似乎不起作用: Predic(X) :- foreach (member (A, X) A \= []). 有人能提供一个修正/更好的选择吗 谢谢您希望列表不包含空列表。这强烈建议您需要一个非空列表 without_empty_list1([]). without_empty_list1([E|Es]) :- E = [_|_], % or more costly dif([], E) without_empty_list1(Es). w

我希望确保列表不包含空列表,但我的尝试似乎不起作用:

Predic(X) :- foreach (member (A, X) A \= []).
有人能提供一个修正/更好的选择吗


谢谢

您希望列表不包含空列表。这强烈建议您需要一个非空列表

without_empty_list1([]).
without_empty_list1([E|Es]) :-
   E = [_|_],   % or more costly dif([], E)
   without_empty_list1(Es).

without_empty_list2(Es) :-
   maplist(dif([]), Es).

without_empty_list3(Es) :-
   maplist(\[_|_]^true, Es).

您希望列表不包含空列表。这强烈建议您需要一个非空列表

without_empty_list1([]).
without_empty_list1([E|Es]) :-
   E = [_|_],   % or more costly dif([], E)
   without_empty_list1(Es).

without_empty_list2(Es) :-
   maplist(dif([]), Es).

without_empty_list3(Es) :-
   maplist(\[_|_]^true, Es).

使用
foreach/2
:部分列表的循环

您的解决方案只需稍作修改:

no_empty_list_inside(L):-
    foreach(member(X,L), X \== []).
如果
L
是一个列表,则此选项有效:

?- L = [a,b,c], foreach(member(X,L), X \== []).
L = [a, b, c].
但如果
L
是部分列表,则循环:

?- L = [z,z|_], foreach(member(X,L), X \== []).
ERROR: Out of global stack
它不是纯粹的,由于后来的统一,可能会导致这样的结果:

?- L =[E], foreach(member(X,L), X \== []), E=[].
L = [[]],
E = [].
仅使用
成员/2
:部分列表失败

检查元素和
[]
[而不是测试不等价性]之间的统一失败通过失败解决了上述问题

?- L = [z,z|_], \+ member([], L).
false.

?- L = [X], \+ member([], L).
false.
使用
maplist/2
dif/2
:它保证
L
不会包含
[]

如果要保证部分列表
L
的任何未来实例化将在其元素中没有
[]
,并且
L
的任何自由变量元素都不会与
[]
统一,则使用
dif/2
(有关更多示例,请参阅)和
maplist/2
。请参见此示例:

?- L=[X], maplist(dif([]), L).
L = [X],
dif(X, []).

?- L = [z,z|_], maplist(dif([]), L).
L = [z, z] ;
L = [z, z, _G1153],
dif(_G1153, []) ;
L = [z, z, _G1197, _G1200],
dif(_G1197, []),
dif(_G1200, []) ;
L = [z, z, _G1241, _G1244, _G1247],
dif(_G1241, []),
dif(_G1244, []),
dif(_G1247, []) .

使用
foreach/2
:部分列表的循环

您的解决方案只需稍作修改:

no_empty_list_inside(L):-
    foreach(member(X,L), X \== []).
如果
L
是一个列表,则此选项有效:

?- L = [a,b,c], foreach(member(X,L), X \== []).
L = [a, b, c].
但如果
L
是部分列表,则循环:

?- L = [z,z|_], foreach(member(X,L), X \== []).
ERROR: Out of global stack
它不是纯粹的,由于后来的统一,可能会导致这样的结果:

?- L =[E], foreach(member(X,L), X \== []), E=[].
L = [[]],
E = [].
仅使用
成员/2
:部分列表失败

检查元素和
[]
[而不是测试不等价性]之间的统一失败通过失败解决了上述问题

?- L = [z,z|_], \+ member([], L).
false.

?- L = [X], \+ member([], L).
false.
使用
maplist/2
dif/2
:它保证
L
不会包含
[]

如果要保证部分列表
L
的任何未来实例化将在其元素中没有
[]
,并且
L
的任何自由变量元素都不会与
[]
统一,则使用
dif/2
(有关更多示例,请参阅)和
maplist/2
。请参见此示例:

?- L=[X], maplist(dif([]), L).
L = [X],
dif(X, []).

?- L = [z,z|_], maplist(dif([]), L).
L = [z, z] ;
L = [z, z, _G1153],
dif(_G1153, []) ;
L = [z, z, _G1197, _G1200],
dif(_G1197, []),
dif(_G1200, []) ;
L = [z, z, _G1241, _G1244, _G1247],
dif(_G1241, []),
dif(_G1244, []),
dif(_G1247, []) .

好吧,你可以自己滚:

list_does_not_contain_empty_list( []     ).
list_does_not_contain_empty_list( [X|Xs] ) :-
  X \= [] ,
  list_does_not_contain_empty_list(Xs)
  .
另一种选择可能是使用
member/3

list_does_not_contain_empty_list(Xs) :- \+ member([],Xs) .
您可以使用
append/3
,但在这种情况下,它没有提供比
member/2
的任何改进:

list_does_not_contain_empty_list(Xs) :- \+ append(_,[[]|_],Xs) .
list_does_not_contain_empty_list(Xs) :- findall(X,(member(X,Xs),X=[]),[]) .
您甚至可以使用
findall/3
(但同样,您也可以使用
member/2
):


好吧,你可以自己滚:

list_does_not_contain_empty_list( []     ).
list_does_not_contain_empty_list( [X|Xs] ) :-
  X \= [] ,
  list_does_not_contain_empty_list(Xs)
  .
另一种选择可能是使用
member/3

list_does_not_contain_empty_list(Xs) :- \+ member([],Xs) .
您可以使用
append/3
,但在这种情况下,它没有提供比
member/2
的任何改进:

list_does_not_contain_empty_list(Xs) :- \+ append(_,[[]|_],Xs) .
list_does_not_contain_empty_list(Xs) :- findall(X,(member(X,Xs),X=[]),[]) .
您甚至可以使用
findall/3
(但同样,您也可以使用
member/2
):


它起作用了,谢谢,你能把这个作为答案,这样我就可以接受吗?它起作用了,谢谢,你能把这个作为答案,这样我就可以接受吗?@TudorBerariu:我的咖啡不够。@TudorBerariu:我的咖啡不够。