Разделение списка без создания пустого списка в Прологе - PullRequest
0 голосов
/ 12 октября 2018
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 голосов
/ 12 октября 2018

Вы можете сначала указать шаблон для X и Y, объединив их с "cons":

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

Преимущество использования этого подхода заключается в том, что вы, вероятно, сохраните некоторыециклы, так как append/3 не будет предлагать определенные решения, которые являются пустыми списками, которые затем должны быть отфильтрованы.

0 голосов
/ 12 октября 2018

Чтобы решить вашу проблему, как сказано в комментариях, вы должны добавить условие, которое проверяет, являются ли 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.

Чтобы лучше понять, я предлагаю вам прочитать эту статью.

...