% 1. last/2

last(list) **> bot.
last([H]) := H.
last(tl:(ne_list,T)) := last(T).





% 2. firstLastSwap/2


firstLastSwap(list) **> list.
firstLastSwap([First|T]) := [Last|swapEm(T,First,Last)].

swapEm(list,bot,bot) **> list.
swapEm([Last],First,Last) := [First].
swapEm([H|(T,ne_list)],First,Last) := [H|swapEm(T,First,Last)].





% 3. deleteA/2

deleteA(list) **> list.
deleteA([a|R]) := R.
deleteA([H|R]) := [H|deleteA(R)].






% 4. containsList/2, relational style

containsListBool(list,list) **> bot.
containsListBool([H|T],[H|R]) := checkSublistRestBool(T,R).
containsListBool([_|T],L) := checkSublistRestBool(T,L).

checkSublistRestBool(list,list) **> bot.
checkSublistRestBool(_,[]) := bot.
checkSublistRestBool([H|T],[H|R]) := checkSublistRestBool(T,R).




% 4. containsList/2, functional style

containsList(list) **> list.
containsList([H|T]) := [H | checkSublistRest(T)].
containsList([_|T]) := containsList(T).

checkSublistRest(list) **> list.
checkSublistRest(_) := [].
checkSublistRest([H|T]) := [H| checkSublistRest(T)].





