append( X, X, Y ). member( X, [a,b,c,d] ), delete( [a,b,c,d], X , [a,c,d] ). append( [a,b,c] , X, [a,b,c,d,e] ).
even( [] ):-!. % to jest odcięcie, nie było tego jeszcze na wykładzie, ale działa tak, że prolog nie próbuje już dopasować innej reguły jak ta będzie ok. even( [] ). % ewentualnie to, jak nie chcecie sie wyróżniać z tłumu, stosować tylko jeden z podanych ;p even( [_,_|T ):-even( T ). palindrom( X ):- reverse( X , X ). %nie jestem pewien, czy nie ma lepszego rozwiazania singleton( [_] ).
head( H, [H|_] ). last( X, [X] ):-!.%tak jak wyżej last( X, [_|T ):-last(X,T). tail( T, [_|T]). init( [], [_] ):-!. init( [H|I], [H|L] ):-init( I, L ). prefix( [], _ ):-!. prefix( [H|P], [H|L] ):-prefix( P, L ). sufix( X, X ):-!. sufix( S, [H|L]):- sufix( S, L ).
sublist( [], [] ):-!. sublist( [H|T], [H|W] ):-sublist( T, W ). sublist( [_|T], W ):-sublist( T, W ).
perm( [], [] ):-!. perm( X , [Y|W] ):- member( Y, X ), delete( X, Y, XLESS ),perm( XLESS, W ).
perm( [], [] ):-!. perm( [H|T], X ):- perm( T, W ), insert( H, W, X ). insert( E, [], [E]):-!. insert( E, W, [E|W] ). insert( E, [H|W], [H|X] ):-insert(E,W,X).