Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
28.06.2014
Размер:
3.66 Кб
Скачать
-- реверсирование списка. первый параметр - исходный, второй - инвариант - результат
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)