Как я могу преобразовать прописные буквы в строчные?
У меня есть предикат, который принимает два аргумента, в которых первый аргумент может быть составным, а второй - всегда B. Я также определил некоторые новые операторы, такие как + и &.
pvc(A, B) :- somestuff(A, B).
Здесь пользователь может напечатать что-то вроде pvc((x+y)&(A+b), B)
,
Как новичок в Прологе, я хочу преобразовать соединение A
на все строчные и звоните somestuff
с новым AN
, Так должно быть somestuff((x+y)&(a+b), B)
,
Я пробовал что-то вроде pvc(A, B) :- downcase_atom(A,AN),somestuff(AN, B).
Но это не похоже на правильный путь. Я буду признателен за любую помощь.
1 ответ
Итак, вам нужно будет навести на структуру вашей вещи, и самый простой способ сделать это с оператором 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)