Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
source_examples.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
306.69 Кб
Скачать

Пример 9.6. Замена заданного символа в строке – на другой

У предиката будет четыре параметра. Первые три — входные (исходная строка; символ, вхождения которого нужно заменять; символ, которым нужно заменять первый символ); четвертым — выходным — параметром должен быть результат замены в первом параметре всех вхождений второго параметра на третий параметр.

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

Возможны два варианта. Либо первый символ исходной строки совпадает с тем, который нужно заменять, либо не совпадает.

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

/* из пустой строки можно получить только пустую строку */

str_replace("",_,_,""):-!.

str_replace(S,C,C1,SO):-

/* заменяемый символ C оказался первым символом строки S, S1 — остаток от S */

frontchar(S,C,S1),!,

/* S2 — результат замены в строке S1 всех вхождений символа C на символ C1 */

str_replace(S1,C,C1,S2),

/* SO — результат склейки символа C1 и строки S2 */

frontchar(SO,C1,S2).

str_replace(S,C,C1,SO):-

/* разделяем исходную строку S на первый символ C2 и строку S2, образованную всеми символами строки S, кроме первого */

frontchar(S,C2,S1),

/* S2 — результат замены в строке S1 всех вхождений символа C на символ C1 */

str_replace(S1,C,C1,S2),

/* SO — результат соединения символа C1 и строки S2 */

frontchar(SO,C1,S2).

Если нам понадобится предикат, который будет заменять не все вхождения первого символа на второй, а только первое вхождение первого символа, то нужно просто из первого правила удалить вызов предиката str_replace(S1,C,C1,S2).

Пример 9.7. Удаление части строки

Предикат будет иметь четыре параметра. Первые три входные: первый — исходная строка, второй — позиция, начиная с которой нужно удалять символы, третий — количество удаляемых символов. Четвертым — выходным — параметром будет результат удаления из строки, указанной в первом параметре, символов, в количестве, указанном в третьем параметре, начиная с позиции, указанной во втором параметре.

Запишем решение этой задачи. Начнем с того, что при помощи предиката frontstr разобьем исходную строку на две подстроки. Во вторую попадут все символы, начиная с той позиции, с которой нужно удалять символы. В первую — начало исходной строки. Вторую подстроку еще раз разделим на две подстроки. В первую подстроку поместим те символы, которые нужно удалить. В этом месте можно будет воспользоваться анонимной переменной. Во вторую подстроку попадут оставшиеся символы остатка исходной строки. Чтобы получить ответ, нам остается только соединить первую подстроку исходной строки с последней подстрокой второй подстроки. Мы получим строку, состоящую в точности из тех символов, которые и должны были остаться в итоговой строке.

str_delete(S,I,C,SO) :-

/* I1 — количество символов, которые должны остаться в начале строки S */

I1 is I-1,

/* S1 — первые I1 символов строки S, S2 — символы строки S, с I —го до посл. */

frontstr(I1,S,S1,S2),

/* S3 — последние символы строки S2, или посл. символы строки S */

frontstr(C,S2,_,S3),

/* SO — строка, полученная соединением строк S1 и S3 */

concat(S1,S3,SO).

?- str_delete('12345', 2, 2, X).

X = '145'

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]