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

Министерство по науке и образованию Российской Федерации

«Новгородский государственный университет имени Ярослава Мудрого»

Кафедра «ИТиС»

Лабораторная работа №5

По теме «ФУНКЦИОНАЛЫ»

Преподаватель

________ Михайлов Д.В.

«___»_________ 2011 г.

Студент гр. 9092

____________ Киреев Д.Д.

«___»_________ 2011 г.

Великий Новгород

2011

Цель работы: Целью лабораторной работы является изучение отображающих и применяющих

функционалов.

Задание 1.

Дан текст. В каждом слове вставить после заданного 3-буквенного сочетания

заданное 2-буквенно

;Х - исходный текст, У - после чего вставляем, Z - что вставляем, N - число совпадений

;Сравниваем символ слова с исходной комбинацией. Если совпало - сравниваем со

;следующей буквой в комбинации до тех пор, пока не совпадут 3 подряд. Если сочетание

;нарушилось - начинаем проверку заново

(define (jugo x y z n)

(cond

((= n 3)(append (cons (first z)(nth 1 z))(jugo x y z 0)))

((null? x)x)

((= (first x)(nth n y))(cons (first x) (jugo (rest x) y z (+ n 1))))

(true (cons (first x)(jugo (rest x) y z 0)))

)

)

;Х - исходный текст, У - после чего вставляем, Z - что вставляем

;Вызываем функцию для 1 слова и объединяем его с рекурсивно вызванной начальной функцией

(define (judg x y z)

(cond

((null? x)x)

(true (append(cons (join(jugo (explode (first x)) (explode (first y)) (explode (first z))0)) (judg (rest x) y z))))

)

)

> (judg '("asd nb mdsf awmdse some") '("mds") '("BB"))

("asd nb mdsBBf awmdsBBe some")

Задание 2.

Дана фраза русского языка. Написать программу, которая разбивает каждое слово фразы на

слоги. Для выполнения этого и последующего задания в muLISP'е рекомендуется

воспользоваться версией интерпретатора mulisp_2.com.

(из-за сложностей с отображением кириллицы в NewLisp-tk сделал задание применительно к английскому языку)

(setq voices '("a" "e" "i" "o" "u" "y"))

;Проверка на гласные

(define (glas x y)

(cond

((null? y)0)

((= (first x) (first y))1)

(true (glas x (rest y)))

)

)

;Функция проверяющая слог. Например, если после гласной есть 2 согласные - то слог состоит из гласной и согласной буквы.

(define (anx x)

(cond

((< (length x) 2)x)

((and (= (glas(first x)voices) 0) (= (glas(first(rest x))voices) 0)(= (glas(first(rest(rest x)))voices) 0)(=(length x) 3))x)

((and (= (glas(first x)voices) 0) (= (glas(first(rest x))voices) 0)(= (glas(first(rest(rest x)))voices) 0))(cons (first x)(first(rest x))))

((and (= (glas(first x)voices) 0) (= (glas(first(rest x))voices) 0))(first x))

(true '())

)

)

;Просматривает слово до тех пор, пока не будет найдена гласная - затем передает

;управление функции ,рассматривающей конкретный слог

(define (jugo x)

(cond

((null? x)x)

((= (glas (first x) voices) 1)(cons (first x) (anx (rest x))))

(true (cons (first x)(jugo (rest x))))

)

)

;Аналог функции построения слогов для слов из 4 букв

(define (anp x)

(cond

((< (length x) 2)x)

((and (= (glas(first x)voices) 0) (= (glas(first(rest x))voices) 0)(= (length x) 2)) x)

((and (= (glas(first x)voices) 0) (= (glas(first(rest x))voices) 0))(first x))

(true '())

)

)

;Аналог функции поиска гласных для слов из 4 букв

(define (juno x)

(cond

((null? x)x)

((= (glas (first x) voices) 1)(cons (first x) (anp (rest x))))

(true (cons (first x)(juno (rest x))))

)

)

;Позволяет разделять уже рассмотренные части слова от нерассмотренных

(define (razrez x y)

(cond

((null? y)x)

(true(razrez (rest x)(rest y)))))

;Деление слова на слоги

(define (pol x)

(cond

((= (length x) 4)(cons(join (juno x))(pol (razrez x(juno x)))))

((<= (length x) 2)(join x))

((null? x)x)

(true (cons (join (jugo x)) (pol (razrez x (jugo x)))))

)

)

;Деление на слоги слова из 3 букв

(define (trio x)

(cond

((and (= (glas(first x)voices) 1) (= (glas(first(rest(rest x)))voices) 1))(cons (join (cons (first x)(first(rest x))))(rest(rest x))))

(true (join x))

)

)

;Проверка,а состоит ли слово из 3 букв из 2 слогов?

(define (trio2 x)

(cond

((and (= (glas(first x)voices) 1) (= (glas(first(rest(rest x)))voices) 1))1)

(true 0)

)

)

;Основная функция

(define (mopl x)

(cond

((null? x)x)

((<= (length(first x)) 2)(cons (first x)(mopl (rest x))))

((and (= (length(first x)) 3)(= (trio2(explode(first x))) 1))(append (trio(explode(first x)))(mopl (rest x))))

((and (= (length(first x)) 3)(= (trio2(explode(first x))) 0))(cons (trio(explode(first x)))(mopl (rest x))))

(true (append (pol(explode(first x)))(mopl (rest x))))

)

)

(mopl '("and" "the" "ceremony" "attemtion" "an" "a" "instruction"))

("and" "the" "ce" "re" "mo" "ny" "at" "tem" "ti" "on" "an" "a" "ins" "truc" "ti"

"on")