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

Задание 3.

“Язык сплетника”. Есть ключевое слово, например, “сплетня”. Слово переводится на язык

сплетника путем отделения первого слога в переводимом и ключевом слове (например, сло-

во и спле-тня) с последующей перестановкой по определенным правилам :

‘(слово сплетня) преобразуется в ‘(сплево слотня).

Каждое слово преобразуется в пару слов. Первое слово есть конкатенация первого слога

ключевого слова и части переводимого слова, оставшейся после отделения от него первого

слога. Второе слово есть конкатенация первого слога переводимого слова и части ключевого

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

(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)(= (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)(= (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 y)

(cond

((= (length x) 4)(cons (join(append (juno y) (razrez x(jugo x)))) (join(append (jugo x) (razrez y(juno y))))))

((= (length y) 4)(cons (join(append (jugo y) (razrez x(juno x)))) (join(append (juno x) (razrez y(jugo y))))))

((and(= (length y) 4)(= (length x) 4))(cons (join(append (jugo y) (razrez x(jugo x)))) (join(append (jugo x) (razrez y(jugo y))))))

((null? x)x)

(true (cons (join(append (jugo y) (razrez x(jugo x)))) (join(append (jugo x) (razrez y(jugo y))))))

)

)

;Если текстовое слово из 3 букв

(define (trio x y)

(cond

(true (cons(join(append (jugo y)(rest(rest x)))) (join(append (cons (first x)(first(rest x)))(razrez y(jugo y))))))

)

)

;Если кодовое слово из 3 букв

(define (trio2 x y)

(cond

(true (cons(join(append (cons (first y)(first(rest y))) (razrez x(juno x))))(join(append (jugo x)(rest(rest y)) ))))

)

)

;Если оба слова из 3 букв

(define (trio3 x y)

(cond

(true (cons (join(append (cons (first y)(first(rest y))) (rest(rest x)))) (join(append (cons (first x)(first(rest x)))(rest(rest y))))))

)

)

;Основная функция - первый список - текст,второй - кодовое слово

(define (mopl x y)

(cond

((null? x)x)

((null? y)y)

((< (length(first y))3)"Invalid entry!")

((and(= (length(first x))3)(= (length(first y))3))(append (trio3(explode(first x))(explode(first y)))(mopl (rest x) y)))

((= (length(first x))3)(append (trio(explode(first x))(explode(first y)))(mopl (rest x) y)))

((= (length(first y))3)(append (trio2(explode(first x))(explode(first y)))(mopl (rest x) y)))

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

)

)

> (mopl '("attempt" "glory" "winnig" "ceremonial") '("hungry"))

("hungtempt" "atry" "hungry" "glory" "hungnig" "winry" "hungremonial" "cery")