Robisz dokładnie to co ci napisałem tzn. wychodzisz od zwykłego rev-a:
rev([], A, A).
rev([X|Xs], A, Y) :-
rev(Xs, [X|A], Y).
rev(X, Y) :- rev(X, [], Y).
Następnie masz dwa przypadki. Albo głowa jest listą ( H = [|]), albo jest singletonem lub zwykłym termem (H != [|]),
co daje następujący kod (Zwróć uwagę na odcięcie, które jest tutaj szalenie ważne) :
deepRev([], A, A).
deepRev([H|Xs], Acc, Y) :-
H = [_|_], !, deepRev(H, Hr),
deepRev(Xs, [Hr|Acc], Y).
deepRev([H|Xs], Acc, Y) :-
deepRev(Xs, [H|Acc], Y).
deepRev(X, Y) :- deepRev(X, [], Y).
Co prawda predykat już działa, ale zauważasz, że dwie środkowe klauzule można skleić w jedną, co skróci nieco kod:
deepRev2([], A, A).
deepRev2([H|Xs], Acc, Y) :-
(
H = [_|_], !, deepRev2(H, Hr) ;
Hr = H
), deepRev2(Xs, [Hr|Acc], Y).
deepRev2(X, Y) :- deepRev2(X, [], Y).
Tyle.