Как я могу преобразовать прописные буквы в строчные?

У меня есть предикат, который принимает два аргумента, в которых первый аргумент может быть составным, а второй - всегда 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) 
Другие вопросы по тегам