split(L,X,Y):-append(X,Y,L).
创建4个拆分,如下所示:
X = [],
Y = [1, 2, 3] ;
X = [1],
Y = [2, 3] ;
X = [1, 2],
Y = [3] ;
X = [1, 2, 3],
Y = [] ;
我要消除拆分期间创建的空列表,并仅保留没有空列表的组合
X = [1],
Y = [2, 3] ;
X = [1, 2],
Y = [3] ;
答案 0 :(得分:1)
为了解决您的问题,如评论中所述,您必须添加条件以这种方式检查X
或Y
是否为空:
split(L,X,Y):-
append(X,Y,L),
x\=[],
Y\=[].
为什么在append/3
之后进行检查? X = []
是正确的,因为在尚未实例化的情况下,X
可以与[]
统一。调用split/3
时,最初X
和Y
未被实例化(如果使用跟踪器,您会看到类似_4604\=[]
的内容):X = []
成功,因此如果将false
和X\=[]
放在Y\=[]
之前,否定将失败,并且程序返回append/3
。
为了更好地理解,我建议您阅读this文章。
答案 1 :(得分:1)
您可以先为X
和Y
指定模式,方法是将它们与“ cons”统一起来:
split(L, X, Y) :-
X = [_|_],
Y = [_|_],
append(X, Y, L).
使用此方法的优点是,您可能会安全一些循环,因为append/3
不会提出某些空列表的解决方案,因此必须将其过滤掉。