Поиск подпоследовательностей из списка - PullRequest
0 голосов
/ 08 октября 2018

Здравствуйте, я не могу понять, как решить задание.Я должен найти последовательные комбинации элементов из списка.Например: список [1,2,3] должен дать мне [1], [2], [3], [1,2], [2,3], [1,2,3], но проблема яесть, что моя попытка также дает мне [1,3]

код:

subseq([], []).
subseq([H|T], [H|R]) :- subseq(T, R).
subseq([_|T], R) :- subseq(T, R).

1 Ответ

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

Проблема здесь в том, что для каждого элемента данного списка у вас есть два предложения:

  1. вторая строка, где вы выбираете элемент;и
  2. третья строка, в которой вы не выбираете элемент.

Это означает, что вы генерируете все списки, где для каждого элемента есть возможность включитьили исключить его.

Для подпоследовательности, определенной в вашем вопросе, это другая история: у вас в основном две точки выбора:

  1. точка, с которой вы «запускаете» подпоследовательность;и
  2. точка, в которой вы «останавливаете» подпоследовательность.

Остановка подпоследовательности фактически аналогична генерации префикса :

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...