Скачиваний:
17
Добавлен:
25.05.2014
Размер:
48.13 Кб
Скачать

Отчёт по функциональному и логическому программированию.

ЗАНЯТИЕ:

Лабораторная работа N 2

ТЕМА:

Функции высших порядков.

ВЫПОЛНИЛ:

Мазурский Михаил Михайлович и Мухаметханов Денис Рамилович

ПРИНЯЛ:

Ризванов Дмитрий Анварович

ДАТА:

17.11.2005

ФАЙЛЫ:

Less-02-(01-10)-muha.lsp&

ВАРИАНТ:

Общие задания и индивидуальные.

Для работы программ необходимо загрузить файл include.lsp.

Задача-1. Сумма 2 матриц! ;-E

; План решения:

;для обработки списочных структур в языке программирования ЛИСП ;предусмотрено множество операторов. такие как mapcar, map-car, mapcon, ;map-con, foreach. на основе таких фукционалов легко создать функции без ;использования рекурсий прямого вида. в представленной программе ;применяется хорошо знакомый функционал mapcar. функция sum-sub ;предназначена для поэлементного сложения списка. Пример ‘(1 2 3) ’(1 2 3) ;возвратит (2 4 6), т.е. складывание первых элементов из обоих списков. функция sum-matrix уже непосредственно производит сумму элементов. в ней также используется функционал mapcar . принцип работы программы: берутся первые элементы из входящих списков и производят вызов функции sum-sub в качестве параметров которой указывают взятые значения из списков ! ! !

; Программное решение:

(defun sum-sub(список1 список2)

(MAPCAR '+ список1 список2)

)

(defun sum-matrixs(mtrx1 mtrx2)

(mapcar

'(lambda (x1 x2) (sum-sub x1 x2))

mtrx1

mtrx2

)

)

; Пример-1 : (sum-matrixs '( (1 1 1) (1 1 1) (1 1 1) ) '( (1 1 1) (1 1 1) (1 1 1) ) )

; Результат обработки : ((2 2 2) (2 2 2) (2 2 2))

; Пример-1 : (sum-matrixs '( (1 2 1) (1 3 1) (1 5 1) ) '( (1 2 1) (1 3 1) (1 5 1) ) )

; Результат обработки : ((2 4 2) (2 6 2) (2 10 2))

; Задача 2. - Произведение матрицы на вектор

; План решения

;дополним функцию sum-sub ещё одним оператором (apply '+ который ;возвратит сумму элементов находящихся в списке (mapcar '* список1 ;список2). при вызове функции get-vectorlist в качестве параметров мы ;указываем вектор и матрицу на которую следует умножить вектор. map-car ;вызывает функцию sum-sub указывая в качестве параметра очередной элемент ;входного списка-массива и списка-вектора…. В качестве результирующего ;получается ВЕКТОР ! ! !

;Программная реализация

(defun sum-sub (список1 список2)

(apply '+ (mapcar '* список1 список2))

)

(defun get-vectorlist(vector-lst lst)

(map-car (lambda (get-lst) (sum-sub vector-lst get-lst)) lst ) ;список

)

; Пример-1: (get-vectorlist '(1 2 3) '( (1 2 3) (1 2 3) (1 2 3) ) )

; Результат обработки: (14 14 14)

; Пример-2: (get-vectorlist '(1 1 1) '( (1 2 3) (1 2 3) (1 2 3) ) )

; Результат обработки: (6 6 6)

; Задача 3 - Произведение матриц

;План решения:

; Программная реализация:

;

;

;

; это общая формула вычисления произведения матриц. Вот и воспользуемся этой ;формулой! в маин proizvedenie-matrix функции происходит поворот второй ;матрицы на 180 градусов (Matr-Map-Car copy lst2) и далее производиться ;операция которая обьеснена в предыдущей задаче!!!

;программная реализация

(defun sum-sub(список1 список2)

(apply '+ (mapcar '* список1 список2))

)

(defun get-sublist(sub-lst lst)

(map-car (lambda (get-lst) (sum-sub sub-lst get-lst)) lst ) ;список

)

(defun proizvedenie-matrix(lst1 lst2)

(map-car (lambda (get-lst1) (get-sublist get-lst1 (Matr-Map-Car copy lst2)) ) lst1)

)

;Пример-1:(proizvedenie-matrix '( (1 2 3) (1 2 3) (1 2 3) ) '( (1 2 3) (1 2 3) (1 2 3) ) )

;Результат обработки:((6 12 18) (6 12 18) (6 12 18))

;Пример-2:(proizvedenie-matrix '( (1 2 3) (1 2 3) (1 2 3) ) '( (1 2 3) (1 2 3) (1 2 3) ) )

;Результат обработки : ((6 12 18) (6 12 18) (6 12 18))

1 - Индивидуальные задания

; ВЫПОЛНИЛ: Мухаметханов Денис Рамилович

; ПРИНЯЛ: Ризванов Дмитрий Анварович

; ДАТА: 05.11.2005

; ФАЙЛ: Les-02-05-muha.lsp

; ВАРИАНТ: 15

; ЗАДАНИЕ (5) - Удалить все элементы большие по модулю числа S

; ПЛАН РЕШЕНИЯ

;На практике возникает необходимость в определении большого количества

;различных функционалов. Учитывая однотипность операций обработки списков

;удобно определить одну универсальную параметризованную функцию высших ;по-рядков, в которой в абстрактной форме реализуются большинство ;необходимых операций над списками.

;в ней содержаться все основные функции с помощью которых можно произвети ;опреации. в этой программе происходит вызов функции DeleteIf которая удаляет ;необходимые элементы по заданному условию ;-E в данном случае

;(lambda (x) (> (abs x) S)).

;ПРОГРАММНАЯ РЕАЛИЗАЦИЯ

(defun УдБолшМодуль(S список)

;задаём необходимое условие и получаем необходимый результат!!!

(DeleteIf (lambda (x) (> (abs x) S)) список)

)

; КОНТРОЛЬНЫЕ ПРИМЕРЫ

; Пример 1: (УдБолшМодуль 10 '(1 2 12 -100))

; Результат: (1 2)

; Пример 2: (УдБолшМодуль 10 '(-120 2 7 8 -2 100))

; Результат: (2 7 8 -2)

; ВЫПОЛНИЛ: Мазурский Михаил Михайлович

; ПРИНЯЛ: Ризванов Дмитрий Анварович

; ДАТА: 05.11.2005

; ФАЙЛ: Les-02-10-muha.lsp

; ВАРИАНТ: 10

; ЗАДАНИЕ (10) – Инвертировать список и все его подсписки

;Для реверса подсписков используем функционал (map-car (lambda (x) (reverse ;x) ). В этом функционале из предлогаемого списка бегётся первый подсписок и ;затем и инвертируется, также происходит и с остальными подсписками. В итоге ;получается список с реверсными подсписками. затем полученный список-;подсписков мы инвертируем через функцию reverse.

; программная реализация

(defun rev-all-list-and-sublist(lst)

(reverse (map-car (lambda (x) (reverse x) ) lst ))

)

; Пример 1: (rev-all-list-and-sublist '( (1 2 3) (1 2 3) (1 2 3) ) )

; Результат: ((3 2 1) (3 2 1) (3 2 1))

; Пример 2: (rev-all-list-and-sublist '( (3 2 1) (3 2 1) (3 2 1) ) )

; Результат: ((1 2 3) (1 2 3) (1 2 3))