Блокирам предикат за кодиране в 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]
...
Благодаря много!
Блокирам предикат за кодиране в 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]
...
Благодаря много!
Въпреки че отговорът на 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 на Prolog-формализъм:
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)).
u(L,P) :- ([ [P,P] | L ], P).
Но ... нямам представа, мисля, че решението е просто ... Трябва да използвам рекурсивност - person Zero   schedule 08.06.2014L
със списък[First, Second | Tail]
. - person Tudor Berariu   schedule 08.06.2014