Последователни елементи в списък

Блокирам предикат за кодиране в 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 на Prolog-формализъм:

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