Добавил:
Tushkan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Готовые лабораторные работы / 3 / 1
.hs -- реверсирование списка. первый параметр - исходный, второй - инвариант - результат
myreverse_1 [] y = y
myreverse_1 (x:xs) y = myreverse_1 xs (x:y)
-- Реверсирование списка
myreverse xs = myreverse_1 xs []
--результатом будет приписывание b справа к а
myconcat a b = myreverse (b:(myreverse a))
-- Результат кортежа <a,b>2
numerateTuplePair (a:b:[]) = ((a+b)*(a+b+1)) `div` 2 + a;
-- Нумерация кортежа
numerateTuple_1 [] = 0
numerateTuple_1 (a:as) = 1 + numerateTuplePair ((numerateTuple_1 as):a:[])
-- Нумерация кортежа
numerateTuple a = numerateTuple_1 (myreverse a)
del [] x = []
del (a:as) x | a == x = del as x
| otherwise = a:(del as x)
----------------------------------------------------------------------------
--Получение пары по номеру
getPair_1 a i | (numerateTuplePair [0,i]) < a = getPair_1 a (i+1)
| (numerateTuplePair [0,i]) > a = getPair_2 a (i-1) 0
| otherwise = [0,i]
getPair_2 a i j |(numerateTuplePair [j,i]) < a = getPair_2 a (i-1) (j+1)
| otherwise = [j,i]
getPair a = getPair_1 a 0
-- Получение кортежа по номеру
getTuple 0 = [0]
getTuple a = let
(x:y:ys) = getPair (a-1)
in if x == 0 then
[y]
else
myconcat (getTuple x) y
--------------------------------------------------------------------------------
--4. Описать функцию, вычисляющую по заданным номерам двух упорядоченных подмножеств нат. чисел номер упорядоченного подмножества, являющегося их конкатенацией. Перед конкатенацией из второго подмножества удаляются все элементы, присутствующие в первом.
concatOrdSubSet [] b = b
concatOrdSubSet (a:as) b = a:(concatOrdSubSet as (del b a))
-- количество эл-тов в списке 1 параметра, меньших чем второй параметр
how [] _ = 0
how (a:as) x | a <= x = 1 + how as x
| otherwise = how as x
-- создание картежа по упорядоченному подмножеству
createTuple [] b = myreverse b
createTuple (a:as) b = createTuple as (a - (how b a):b)
-- нумерация упорядоченного подмножества
numerateOrdSubSet a = numerateTuple (createTuple a [])
--вычисление следующего элемента при переводе кортежа в упорядоченное подмножество
getNextItem [] x k = x
getNextItem as 0 0 = getNextItem as 0 1
getNextItem as x k |(how as (x+k)) == k = x+k
| otherwise = getNextItem as x (k+1)
-- Второй параметр - инвариант. Первый- исходный список
tupleToOrdSubSet_1 [] b = myreverse b
tupleToOrdSubSet_1 (a:as) b = tupleToOrdSubSet_1 as ((getNextItem b a 0):b)
--Перевод кортежа в упорядоченное подмножество
tupleToOrdSubSet a = tupleToOrdSubSet_1 a []
--Получение упорядоченного подмножества по номеру
getOrdSubSet a = tupleToOrdSubSet(getTuple a)
--Функция по заданию.
numerateOrdSubSets a b = numerateOrdSubSet (concatOrdSubSet (getOrdSubSet a) (getOrdSubSet b))
------------------------------------------------------
--8. Описать функцию, вычисляющую по заданному номеру упоряд. подмножества нат. чисел, числу и позиции номер упоряд. подмножества, полученного вставкой заданного числа на заданную позицию исходного подмножества.
addToPos [] x 0 = [x]
addToPos [] x p = error "range check"
addToPos as x 0 = x:as
addToPos (a:as) x p = a:(addToPos as x (p-1))
zadanie n x p = numerateOrdSubSet (addToPos (getOrdSubSet n) x p)
myreverse_1 [] y = y
myreverse_1 (x:xs) y = myreverse_1 xs (x:y)
-- Реверсирование списка
myreverse xs = myreverse_1 xs []
--результатом будет приписывание b справа к а
myconcat a b = myreverse (b:(myreverse a))
-- Результат кортежа <a,b>2
numerateTuplePair (a:b:[]) = ((a+b)*(a+b+1)) `div` 2 + a;
-- Нумерация кортежа
numerateTuple_1 [] = 0
numerateTuple_1 (a:as) = 1 + numerateTuplePair ((numerateTuple_1 as):a:[])
-- Нумерация кортежа
numerateTuple a = numerateTuple_1 (myreverse a)
del [] x = []
del (a:as) x | a == x = del as x
| otherwise = a:(del as x)
----------------------------------------------------------------------------
--Получение пары по номеру
getPair_1 a i | (numerateTuplePair [0,i]) < a = getPair_1 a (i+1)
| (numerateTuplePair [0,i]) > a = getPair_2 a (i-1) 0
| otherwise = [0,i]
getPair_2 a i j |(numerateTuplePair [j,i]) < a = getPair_2 a (i-1) (j+1)
| otherwise = [j,i]
getPair a = getPair_1 a 0
-- Получение кортежа по номеру
getTuple 0 = [0]
getTuple a = let
(x:y:ys) = getPair (a-1)
in if x == 0 then
[y]
else
myconcat (getTuple x) y
--------------------------------------------------------------------------------
--4. Описать функцию, вычисляющую по заданным номерам двух упорядоченных подмножеств нат. чисел номер упорядоченного подмножества, являющегося их конкатенацией. Перед конкатенацией из второго подмножества удаляются все элементы, присутствующие в первом.
concatOrdSubSet [] b = b
concatOrdSubSet (a:as) b = a:(concatOrdSubSet as (del b a))
-- количество эл-тов в списке 1 параметра, меньших чем второй параметр
how [] _ = 0
how (a:as) x | a <= x = 1 + how as x
| otherwise = how as x
-- создание картежа по упорядоченному подмножеству
createTuple [] b = myreverse b
createTuple (a:as) b = createTuple as (a - (how b a):b)
-- нумерация упорядоченного подмножества
numerateOrdSubSet a = numerateTuple (createTuple a [])
--вычисление следующего элемента при переводе кортежа в упорядоченное подмножество
getNextItem [] x k = x
getNextItem as 0 0 = getNextItem as 0 1
getNextItem as x k |(how as (x+k)) == k = x+k
| otherwise = getNextItem as x (k+1)
-- Второй параметр - инвариант. Первый- исходный список
tupleToOrdSubSet_1 [] b = myreverse b
tupleToOrdSubSet_1 (a:as) b = tupleToOrdSubSet_1 as ((getNextItem b a 0):b)
--Перевод кортежа в упорядоченное подмножество
tupleToOrdSubSet a = tupleToOrdSubSet_1 a []
--Получение упорядоченного подмножества по номеру
getOrdSubSet a = tupleToOrdSubSet(getTuple a)
--Функция по заданию.
numerateOrdSubSets a b = numerateOrdSubSet (concatOrdSubSet (getOrdSubSet a) (getOrdSubSet b))
------------------------------------------------------
--8. Описать функцию, вычисляющую по заданному номеру упоряд. подмножества нат. чисел, числу и позиции номер упоряд. подмножества, полученного вставкой заданного числа на заданную позицию исходного подмножества.
addToPos [] x 0 = [x]
addToPos [] x p = error "range check"
addToPos as x 0 = x:as
addToPos (a:as) x p = a:(addToPos as x (p-1))
zadanie n x p = numerateOrdSubSet (addToPos (getOrdSubSet n) x p)