Ответ в теме: Линеаризация списка функций — SWI Prolog

      Комментарии к записи Ответ в теме: Линеаризация списка функций — SWI Prolog отключены
#1741

В SWI Prolog есть чудный оператор «=..», который надо использовать в твоей задаче (с ним она решается более чем тривиально).
Оператор этот, преобразует список в функцию {функцию потом можно вызвать предикатом call}. Первым аргументом списка должно идти имя функции. Например список [f, g, h] он превратит в f(g, h).

?- X =.. [f, g, h].
X = f(g, h).

Но можно сделать и обратное действие, если поменять аргументы местами:

?- f(g, h) =.. X.
X = [f, g, h].

Но, именно это тебе и требуется, вроде бы.
После первого применения этого оператора к функции твоего примера, картина будет такой:

?- f(a, f1(b,c), f2( d, f3(e))) =.. X.
X = [f, a, f1(b, c), f2(d, f3(e))].

Очевидно, тебе нужна штука, которая обходит список, ищет в нем функции (скорее всего поможет стандартный предикат callable), применяет к ним оператор «=..» и обрабатывает рекурсивно результат.