Вот небольшой пример специализированного кода Prolog для вашей задачи, который должен работать на большинстве реализаций (не только SWI-Prolog, но и GNU Prolog, SICStus и т. Д.):
make_term(Functor, StringArgs, Term) :-
split_atom(StringArgs, ',', Args),
Term =.. [Functor|Args].
split_atom(A, E, L) :-
atom_chars(A, C),
split_atom2(C, E, L).
split_atom2([], _, []).
split_atom2(C, E, [A|L]) :-
append(C0, [E|C1], C), !,
atom_chars(A, C0),
split_atom2(C1, E, L).
split_atom2(C, _, [A]) :-
atom_chars(A, C).
Тестирование:
?- make_term(things, 'pen,pencil,eraser', T).
T = things(pen, pencil, eraser).