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

Пример 9.8. Копирование части строки

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

Для решения этой задачи опять воспользуемся предикатом frontstr. Сначала получим хвост нашей строки, начиная с той позиции, c которой нужно копировать символы. Если после этого взять столько первых символов новой строки, сколько их нужно копировать, получим в точности ту подстроку исходной строки, которую требуется получить.

Зафиксируем наши рассуждения.

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

/* I1 — это количество символов, расположенных в начале строки S, которые не нужно копировать */

I1 is I-1,

/* S1 — строка, состоящая из всех символов строки S, с I-го и до последнего */

frontstr(I1,S,_,S1),

/* SO — первые C символов строки S1 */

frontstr(C,S1,SO,_).

Пример 9.9. Вставка одной строки внутрь другой

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

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

Запишем:

str_insert(S,S1,I,SO) :-

/* I1 — это количество символов, расположенных в начале строки S, после которых нужно вставить новые символы */

I1 is I-1,

/* S1_1 — первые I1 символов строки S1, S1_2 — остаток строки S1, с I —го и до последнего */

frontstr(I1,S1,S1_1,S1_2),

/* S2 — строка, полученная объединением строк S1_1 и S */

concat(S1_1,S,S2),

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

concat(S2,S1_2,SO).

10. Множества Пример 10.1. Превращение произвольного списка в множество

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

Предикат будет реализован посредством рекурсии. Базисом рекурсии является очевидный факт: в пустом списке никакой элемент не встречается более одного раза. Шаг рекурсии позволит выполнить правило: чтобы сделать из непустого списка множество (в нашем понимании этого понятия), нужно удалить из хвоста списка все вхождения первого элемента списка, если таковые вдруг обнаружатся. После выполнения этой операции первый элемент гарантированно будет встречаться в списке ровно один раз. Для того чтобы превратить во множество весь список, остается превратить во множество хвост исходного списка. Для этого нужно только рекурсивно применить к хвосту исходного списка наш предикат, удаляющий повторные вхождения элементов. Полученный в результате из хвоста список с приписанным в качестве головы первым элементом и будет требуемым результатом (множеством, т.е. списком, образованным элементами исходного списка и не содержащим повторных вхождений элементов).

/* пустой список является списком в нашем понимании */

list_set([],[]).

list_set ([H|T],[H|T1]) :-

/* T2 — результат удаления вхождений первого элемента исходного списка H из хвоста T */

delete_all(H,T,T2),

/* T1 — результат удаления повторных вхождений элементов из списка T2 */

list_set (T2,T1).

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