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

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

Если я позвоню: 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] ...

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


person Zero    schedule 08.06.2014    source источник
comment
Вы пробовали кодировать любой из них? Пожалуйста, поделитесь результатами, чтобы мы могли помочь вам исправить ваш код.   -  person Sergey Kalinichenko    schedule 08.06.2014
comment
Для первого в этом списке я пытаюсь извлечь 2 первых элемента L: u(L,P) :- ([ [P,P] | L ], P). Но... понятия не имею, думаю, решение простое... мне нужно использовать рекурсивность   -  person Zero    schedule 08.06.2014
comment
Затем вы должны объединить L со списком [First, Second | Tail].   -  person Tudor Berariu    schedule 08.06.2014


Ответы (3)


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

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

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

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

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

person Tudor Berariu    schedule 08.06.2014
comment
Большое спасибо, так что это работает для V с другим _ :) ... Мы поняли! - person Zero; 08.06.2014

Предполагая, что под 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.
person false    schedule 08.06.2014
comment
Дело в том, что... С 2-мя параметрами это не логично... Мы 5 друзей пытаемся выучить Пролог, наш экзамен через 2 дня... Пожалуйста, помогите нам... - person Zero; 08.06.2014

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

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


v(L, X) :-
     append([A,B], L1,L),
    (   X = [A,B]; v(L1, X)).
person joel76    schedule 08.06.2014