Ответ в теме: Замена звездочек в строке

#3323

Вашу задачу можно решить так:

PREDICATES							
	swap_star_plus(string, string)
CLAUSES
	swap_star_plus("", ""):-!.
	swap_star_plus(String, Result):-
		frontchar(String, '*', StringWithoutStar), !,
		frontchar(StringWithoutStar, _, StringTail),
		frontchar(StringTailWithPlus, '+', StringTail),
		frontchar(Result, '*', StringTailWithPlus).
	swap_star_plus(String, Result):-
		frontchar(String, Char, StringTail),
		swap_star_plus(StringTail, TailResult),
		frontchar(Result, Char, TailResult).
GOAL
  	swap_star_plus("dsgdgdsd *dsfdsfds fdsfsf* fdgdsfgd", X).

Преобразовывать строку в список и назад не обязательно. В списке вы можете отделять от списка первый элемент и прикреплять элемент в начало списка, но тоже самое можно делать со строками с помощью стандартных предикатов frontchar.

swap_star_plus

Первое правило предиката swap_star_plus предназначено для выхода из рекурсии если строка станет пустой. В противном случае выполняется второе или третье правило. Во втором правиле мы пробуем отделить от строки символ звездочки, если это получается – то:

  1. запрещаем переход на третье правило с помощью отсечения;
  2. отделяем символ, следующий за звездочкой;
  3. к полученному остатку строки дописываем символ “+”;
  4. наконец, дописываем звездочку, которую мы изъяли первым шагом;

Если же отделить звездочку не получается (она не является первым символом строки – выполняется третье правило, которое отделяет первый символ, остальную часть обрабатывает рекурсивно, а затем возвращает изъятый символ к полученному результату.