Итак, вам нужно будет навести на структуру вашей вещи, и самый простой способ сделать это с помощью оператора Univ =../2
. Сначала обработайте ваш базовый случай, что вы и сделали:
downcase_compound(A, B) :- atom(A), downcase_atom(A, B).
Теперь вы разберете структуру и наведете ее на univ:
downcase_compound(A, B) :-
compound(A),
A =.. [Functor|Args],
downcase_compound(Functor, DowncaseFunctor),
maplist(downcase_compound, Args, DowncaseArgs),
B =.. [DowncaseFunctor|DowncaseArgs].
Хитрость здесь в том, чтобы просто разбить ваше соединение на биты, которые вы можете использовать, а затем рекурсивно вызвать downcase_compound/2
для этих битов. Смотрите это в действии:
?- downcase_compound((x+y,('A'+b)), X).
X = (x+y, a+b)