Последовательные элементы в списке
Я блокирую предикат для кодирования в Прологе. Мне нужно кодировать эти два предиката:
Если я позвоню: 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)).