2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 01:57 


05/09/12
2587
Понятно. Мое $(0, 1)$ не является неподвижной точкой, поскольку тождественно единичная функция не сохраняется при действии оператора. $([0..n], n!)$ является неподвижной точкой, но не является минимальной с учетом заданного отношения порядка. $(0, n!)$ - минимальная неподвижная точка данного множества.

Непонятно еще - если применение нашего оператора к частичной функции всегда расширяет ее домен (или это не так?), то формально неподвижная точка отсутствует. С доменом буду думать еще. Например, однократное применение оператора к $(0, n!)$ даст $([0,1], n!)$ или я ошибаюсь?

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

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 02:03 
Заслуженный участник


27/04/09
28128
_Ivana в сообщении #928074 писал(а):
Пока писал, появился еще комментарий. Сравнимы, и первое меньше. Все по определению отношения порядка в первом посте - ноль входит подмножеством во второй домен, обе функции совпадают на первом домене нуле.
Ага, так. Правда, я зря написал. Первая функция ведь действительно не неподвижная точка, так что и смысла в сравнении не было. :-)

_Ivana в сообщении #928074 писал(а):
$(0, n!)$
А чем это отличается от $(0,1)$? Это ведь $(\{0\},n\mapsto n!)$? И тогда это то же самое, что $(\{0\},\operatorname{const}1)$, т. к. сравнимы в обе стороны.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 02:04 
Заслуженный участник
Аватара пользователя


06/10/08
6422
_Ivana в сообщении #928074 писал(а):
Мое $(0, 1)$ не является неподвижной точкой, поскольку тождественно единичная функция не сохраняется при действии оператора. $([0..n], n!)$ является неподвижной точкой, но не является минимальной с учетом заданного отношения порядка. $(0, n!)$ - минимальная неподвижная точка данного множества.
Неверно. $(\{0\}, 1)$ не является неподвижной точкой потому, что $\varphi(\{0\}, 1) = (\{0, 1\}, \{0\mapsto 1, 1\mapsto 1\})$ это другая частичная функция, с другой областью определения. Точно так же и $([0..n], n\mapsto n!)$ не является неподвижной точкой, у нее тоже $\varphi$ меняет область определения. $(\{0\}, \operatorname{const} 1)$ и $(\{0\}, n \mapsto n!)$ это одно и то же, так как нас интересуют только значения на области определения (посмотрите на определение частичной функции, там $f\colon S_0\to S$, а не $f\colon S\to S$).

-- Сб ноя 08, 2014 02:06:02 --

_Ivana в сообщении #928074 писал(а):
Например, однократное применение оператора к $(0, n!)$ даст $([0,1], n!)$ или я ошибаюсь?
Верно.

Почему Вы думаете, что домен обязательно должен быть конечным? Этого нигде написано не было.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 02:16 


05/09/12
2587
Написал, прочитал последний комментарий и стер. Получается, что для сохранения домена он должен сразу включать в себя все натуральные числа, чтобы никакое многократное действие оператора не могло его изменить и чтобы это была честная неподвижная точка - тогда $(\mathbb{N}, n!)$. И даже если сейчас я наконец-то угадал ответ, я не удовлетворен степенью моего понимания.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 02:29 
Заслуженный участник


27/04/09
28128
Теперь правильно.

Можете разбить область определения $f$ на непересекающиеся и не примыкающие друг к другу (в смысле, существует число, большее всех элементов одного и меньшее всех элементов другого) непустые множества вида $m..n$ или $m..\infty$. После применения $\phi$ область определения пополнится столькими элементами, сколько элементов в разбиении, у которых есть конечная верхняя грань, и ещё нулём, если он отсутствует. Так что конечных элементов в разбиении быть не должно, а ноль должен входить в область определения. Единственный вариант — всё $\mathbb N$.

(Тут было неудовлетворение, или где-то в другом месте?)

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 02:38 


05/09/12
2587
Спасибо, многое стало более понятным. То есть, наша неподвижная точка единственна, и поэтому она же минимальна. С промежуточными подзадачками типа доказательства монотонности/непрерывности оператора, применения его к другим функциям, нахождению другого оператора, чьей неподвижной точкой будет являться функция Фибоначчи и т.п. подумаю, если опять залезу в тупик, буду спрашивать.
А насчет реализации всего этого дела на Haskell - конечно хотелось бы в итоге добиться. Разумеется, не просто функции факториала и Фибоначчи, а поиск неподвижных точек любых операторов и что там еще заманчиво предлагалось в задании.

UPD неудовлетворение было (и осталось) в нечетком понимании действия оператора на домен - мне конечно неоднократно подсказали как оно происходит, но за факториалом я не уделил должного внимания, чтобы разобраться в этом моменте. Хотя сейчас все вроде прозрачно - если исходная функция определена на ограниченном подмножестве натурального ряда, то новая определена еще на одном значении, на единицу большем максимального значения исходного подмножества.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 14:37 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Давайте попробуем с реализацией на Haskell. Нас просят реализовать нахождение неподвижной точки на любом strict $\omega$-CPO. Что это значит? Это значит, что мы должны работать с типами, для которых мы умеем взять минимальное значение и уметь находить супремум монотонной последовательности. Предлагаю задать это в виде класса типов
Используется синтаксис Haskell
class CPO a where
bottom :: a
sup :: [a] -> a


Вот попробуйте, учитывая то, что Вы прочитали в Википедии, реализовать функцию fixpoint :: (CPO a) => (a -> a) -> a, которая по монотонной функции f будет вычислять ее неподвижную точку.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 20:37 


05/09/12
2587
Мне стыдно выкладывать некомпилирующийся код, но на сейчас это максимум (супремум), до чего я додумался. У меня всего 5-й уровень на Codewars, но этого недостаточно, чтобы уметь решать простейшие задачки на Haskell.
код: [ скачать ] [ спрятать ]
Используется синтаксис Haskell
class CPO a where
    bottom :: a
    sup :: [a] -> a

instance CPO Double where
    bottom = 0
    sup [a] = maximum [a]

fixpoint :: (CPO a) => (a -> a) -> a
fixpoint f = sup ( l [bottom] 500 ) where
    l x 0 = x
    l x n = l ((f.head $ x):x) (n-1)

f :: Double -> Double
f x = x/2 + 0.25
s = fixpoint f

main = do
    print $ s
Пытался сделать для банального примера отсюда, но с бесконечным списком ленивый Haskell все равно зависал при попытке вычислить его максимум, а с новым классом типов и его реализацией даже для чисел возникли сложности. Я продолжаю блуждания в азах дальше, код выложил просто чтобы показать удручающее текущее состояние дел.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 21:57 


05/09/12
2587
Пока думал над кодом, понял одну тривиальную вещь - в примерах с поиском неподвижных точек операторов на частично упорядоченном множестве частичных функций мы всегда начинаем с минимального элемента этого множества - $(\{\}, \{\})$, первое применение оператора добавляет в пустой домен ноль и определяет функцию на нем, второе применение - добавляет в домен к нулю единицу и определяет функцию на двух элементах 0 и 1, и т.д., в результате в качестве супремума мы получаем в домене все множество натуральных чисел, а в функции - факториал, Фибоначчи или что еще в зависимости от оператора, определенное на каждом элементе домена - то есть на всем домене. Это, возможно, справедливо для любых монотонных функций, и кажется, теорема Клини об этом. Хотя, интересно рассмотреть различные операторы, приводящие к разным функциям в виде их неподвижных точек, например, определенные не на всем множестве натуральных чисел.
Но это так, лирика по ходу сражения с Haskell.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 22:10 
Заслуженный участник
Аватара пользователя


06/10/08
6422
_Ivana в сообщении #928453 писал(а):
Пока думал над кодом, понял одну тривиальную вещь - в примерах с поиском неподвижных точек операторов на частично упорядоченном множестве частичных функций мы всегда начинаем с минимального элемента этого множества - $(\{\}, \{\})$, первое применение оператора добавляет в пустой домен ноль и определяет функцию на нем, второе применение - добавляет в домен к нулю единицу и определяет функцию на двух элементах 0 и 1, и т.д., в результате в качестве супремума мы получаем в домене все множество натуральных чисел, а в функции - факториал, Фибоначчи или что еще в зависимости от оператора, определенное на каждом элементе домена - то есть на всем домене. Это, возможно, справедливо для любых монотонных функций, и кажется, теорема Клини об этом.
Это как раз то, что стоит вынести из этого упражения - произвольная рекурсия может быть представлена как применение оператора фиксированной точки.

А по повоу кода - здесь действительно будут проблемы, потому что супремум бесконечного списка даблов вычислить нельзя. Давайте все-таки ближе к оригинальной задаче определим data PartialFunc a = PartialFunc {domain :: [a], eval :: a -> a}, определим instance CPO PartialFunc, запишем phi :: PartialFunc Int -> PartialFunc Int и проверим fixpoint phi на каких-нибудь значениях, например, проверим, что числа от 0 до 7 принадлежат domain (fixpoint phi) и map (eval $ fixpoint phi) [0..7] равно map (\n -> product [1..n]) [0..7]

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 23:24 


05/09/12
2587
Не осилил классы типов и ограничение на прекращение применения оператора (когда уже достаточно крутить его применение), по мелочам типа поиска максимума в списке вместо взятия головы и ограничения на область определения $k$ - что имхо необязательно, могу доработать. Такой вот ленивый недокот, но как-то работает:
код: [ скачать ] [ спрятать ]
Используется синтаксис Haskell
data PartialFunc = PartialFunc {domain :: [Int], eval :: Int -> Int}

phi :: PartialFunc -> PartialFunc
phi pf = pf {domain = (n:domain pf), eval = k} where
    n = case domain pf of
        [] -> 0
        _  -> head (domain pf) + 1
    k 0 = 1
    k i = i*((eval pf) (i-1))

fixpoint phi n = fixpoint' phi n acc0 where
    acc0 = PartialFunc {domain = [], eval = \x->x}
    fixpoint' phi 0 acc = acc
    fixpoint' phi n acc = fixpoint' phi (n-1) (phi acc)

main = do
    let ltest = [0..7]
    print $ map (\n -> product [1..n]) ltest
    print $ map (eval $ fixpoint phi ((head.reverse $ ltest)+1)) ltest

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение08.11.2014, 23:48 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Ну вот и хорошо. Единственное, я бы написал domain = 0:(map (+1) $ domain pf), чтобы работало для любых domain, а не только тех, что встречаются в нашей задаче.

Надеюсь, когда-нибудь Вы вернетесь к этому заданию и поймете, что все было очевидно.

Осталось только сказать, что в Haskell тип a -> b - это частичные функции, и функция fix :: (a -> a) -> a, определенная как fix phi = x where x = phi x находит неподвижную точку. Но работает это не через последовательность $\perp, \phi \perp, \phi (\phi \perp), \dots$, а потому что так получается при ленивой стратегии вычисления. Получается то, что мы писали раньше: если $f = \phi f$, то $f 0 = 1$ и $f n = n \cdot f (n - 1)$.

 Профиль  
                  
 
 Re: Задачка из вводной лекции по Haskell
Сообщение09.11.2014, 00:01 


05/09/12
2587
Спасибо за помощь, я все-таки попробую разобраться с реализацией через классы типов. Хотя я все-таки не понял, сколько раз крутить композицию оператора - получается, что в общем случае бесконечно, или до максимального аргумента для которого надо рассчитать значение нашей функции - функции неподвижной точки. Ваша запись очень похожа на зацикливающуюся, поэтому такое не стал пробовать.
Ну и конечно хочется еще поиграться с какими-нибудь операторами, которые могут дать менее тривиальные ряды, чем факториал или Фибоначчи, или функции, определенные на конечном множестве натуральных чисел.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group