Вот моя версия:
list_swizzle([H|T], [], [H|T]).
list_swizzle([], L, L).
Я рассчитываю, что [] не объединится против [H | T] в первом факте. Другими словами [] не имеет T, потому что это пустой список, поэтому первый факт не соответствует целям с [] в первом аргументе.
Я успешно выполнил это на SWI-Prolog (многопоточный, 32 бита, версия 5.8.2)
$ cat tt.pl
s([H|T], [], [H|T]).
s([], L, L).
....
For help, use ?- help(Topic). or ?- apropos(Word).
?- [tt].
% tt compiled 0.00 sec, 920 bytes
true.
?- s(L,[],[]).
L = [].
?-
% halt