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

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

Не понял я почему должен получиться именно такой список (особенно, почему там [e] написано).
Вот такой код решает вашу задачу:

f_to_list([], []):-!.
f_to_list([H|T], R):-
  H =.. L, length(L, Len), Len > 1, !, f_to_list(L, LR), f_to_list(T, TR), R = [LR|TR];
  f_to_list(T, TR), R = [H|TR].

callable не помог. Я ошибся. Мы преобразуем функтор в список оператором «=..», а затем проверяем наличие аргументов. Если длина списка больше 1 — то аргументы есть, иначе — их нет. Если аргументы есть — надо их рекурсивно обработать.

Пример вызова:

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

Удалить первые элементы всех вложенных списков может такое правило:

rem_heads([], []):-!.
rem_heads([H|T], R):-
    is_list(H), !, H = [_|HT], rem_heads(HT, HTR), rem_heads(T, TR), R = [HTR|TR];
    rem_heads(T, TR), R = [H|TR].

Для твоего примера я вызывал его следующим образом:

?- f_to_list([f(a, f1(b,c), f2(d, f3(e)))], L), rem_heads(L, R), write(L), nl, write(R), nl.
[[f,a,[f1,b,c],[f2,d,[f3,e]]]]
[[a,[b,c],[d,[e]]]]

Линеаризовать результат может предикат flatten (стандартный):

?- f_to_list([f(a, f1(b,c), f2(d, f3(e)))], L), rem_heads(L, R), flatten(R, FR).
L = [[f, a, [f1, b, c], [f2, d, [f3|...]]]],
R = [[a, [b, c], [d, [e]]]],
FR = [a, b, c, d, e].