Проблема здесь в том, что для каждого элемента данного списка у вас есть два предложения:
- вторая строка, где вы выбираете элемент;и
- третья строка, в которой вы не выбираете элемент.
Это означает, что вы генерируете все списки, где для каждого элемента есть возможность включитьили исключить его.
Для подпоследовательности, определенной в вашем вопросе, это другая история: у вас в основном две точки выбора:
- точка, с которой вы «запускаете» подпоследовательность;и
- точка, в которой вы «останавливаете» подпоследовательность.
Остановка подпоследовательности фактически аналогична генерации префикса :
myprefix(_, []).
myprefix([H|T], [H|T2]) :-
myprefix(T, T2).
Так что теперь для подпоследовательности нам нужно только разветвиться над начальной точкой , а затем добавить префикс оставшегося списка, например:
subsequence([H|T], [H|T2]) :-
myprefix(T, T2).
subsequence([_|T], T2) :-
subsequence(T, T2).
Это тогда дастожидается:
?- subsequence([1, 2, 3], X).
X = [1] ;
X = [1, 2] ;
X = [1, 2, 3] ;
X = [2] ;
X = [2, 3] ;
X = [3] ;
false.