Как я могу преобразовать прописные буквы в строчные? - PullRequest
0 голосов
/ 08 января 2019

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

0 голосов
/ 08 января 2019

Итак, вам нужно будет навести на структуру вашей вещи, и самый простой способ сделать это с помощью оператора 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) 
...