拆分列表而不在Prolog中创建空列表

时间:2018-10-12 01:34:42

标签: list split prolog append

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] ;

2 个答案:

答案 0 :(得分:1)

为了解决您的问题,如评论中所述,您必须添加条件以这种方式检查XY是否为空:

split(L,X,Y):- 
    append(X,Y,L),
    x\=[], 
    Y\=[].

为什么在append/3之后进行检查? X = []是正确的,因为在尚未实例化的情况下,X可以与[]统一。调用split/3时,最初XY未被实例化(如果使用跟踪器,您会看到类似_4604\=[]的内容):X = []成功,因此如果将falseX\=[]放在Y\=[]之前,否定将失败,并且程序返回append/3

为了更好地理解,我建议您阅读this文章。

答案 1 :(得分:1)

您可以先为XY指定模式,方法是将它们与“ cons”统一起来:

split(L, X, Y) :-
    X = [_|_],
    Y = [_|_],
    append(X, Y, L).

使用此方法的优点是,您可能会安全一些循环,因为append/3不会提出某些空列表的解决方案,因此必须将其过滤掉。