Последовательные элементы в списке

Я блокирую предикат для кодирования в Прологе. Мне нужно кодировать эти два предиката:

Если я позвоню: u([a,b,c,d,e,f], X). это даст X=[a,b], X=[b,c], X=[c,d]...

Если я позвоню: v([a,b,c,d,e,f], X). это даст X=[a,b], X=[c,d], X=[e,f]...

Большое спасибо!

3 ответа

Решение

Хотя false ответ более элегантен, вот решение, более подходящее для начинающих для вашего предиката u/2,

u([X,Y|_], [X,Y]).
u([_|Tail], XY):- u(Tail,XY).

Первое правило гласит, что [X,Y] представляют два последовательных элемента в списке, если они являются первыми двумя элементами в этом списке.

Второе правило гласит, что два элемента являются последовательными в списке, если они являются последовательными где-то в конце списка.

Теперь попробуйте найти подобное решение для v/2,

Предполагая, что X=[a,b], X=[b,c], X=[c,d] .... вы на самом деле имеете в видуX=[a,b] ; X=[b,c] ; X=[c,d] ; ...Вот решение, использующее dcg-формализм Пролога:

u(Xs, [X,Y]) :-
   phrase(( ..., [X,Y], ... ), Xs).

... --> [] | [_], ... .

v(Xs, [X,Y]) :-
   phrase(( evenell, [X,Y], ...), Xs).

evenell --> [] | [_,_], evenell.

Я думаю, что вы должны использовать append:

u(L, [A,B]) :-
    append(_, [A,B|_], L).


v(L, X) :-
     append([A,B], L1,L),
    (   X = [A,B]; v(L1, X)).
Другие вопросы по тегам