2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Fix, «добавление» конструкторов и деконструкция [Haskell]
Сообщение26.06.2015, 11:05 
Заслуженный участник


27/04/09
28128
Решил написать кое-что для манипулирования формулами нулевого и первого порядка. Притом, чтобы не дублировать код, сделал так:

Используется синтаксис Haskell
data ShallowFormula0 a uo bo f = Atom a
                               | Un uo f
                               | Bin bo f f
                               deriving (Eq, Ord)

data ShallowFormula1 a uo bo q f = F0 (ShallowFormula0 a uo bo f)
                                 | Q q f
                                 deriving (Eq, Ord)

type Formula0 = Fix (ShallowFormula0 Prop UnOp BinOp)

type Formula1 = Fix (ShallowFormula1 (Pred Term) UnOp BinOp Quantifier)

и сделал их также инстансами класса

Используется синтаксис Haskell
class Formula f a uo bo | f -> a, f -> uo, f -> bo where
  -- smart constructors
  atom       :: a -> f
  unary      :: uo -> f -> f
  binary     :: bo -> f -> f -> f
  quantif    :: Quantifier -> f -> Formula1
  -- преобразования туда-сюда без потерь и с потерями
  firstOrder :: f -> Formula1
  truncate   :: f -> Formula0
  -- и, из-за использования индексов де Брёйна в Formula1,
  isValid    :: f -> Bool

позволяющего конструировать их единообразно. А что делать с деконструкцией? Включить в класс набор функций asAtom :: f -> Maybe a, asQuantif :: f -> (q, f) etc.? Чего-то резко забыл, как принято деконструировать ADT’ы.

Заодно принимаю предложения по переименованию (Formula1 как-то не с тем ассоциируется) и переделке этих типов — сейчас в коде инстанса Formula Formula1 (Pred Term) UnOp BinOp в двух методах двухуровневый матчинг, в одном из уровней по конструкторам ShallowFormula0, что явно не дело (может, есть смысл сделать по типу на конструктор, а потом собрать их в оба нужных типа как-то иначе, перераспределив код (отфакторизовав какие-нибудь классы и инстансы, возможно) к этим мелким типам, а не двум конечным? Я явно что-то упускаю.

Возможно, и ну его, и работать только с формулами первого порядка, т. к. формулы нулевого полностью вкладываются (пропозициональные переменные = нульместные предикатные символы), но ещё подумываю, начав с одного представления правил вывода

код: [ скачать ] [ спрятать ]
Используется синтаксис Haskell
data InfRule f = InfRule {
  arity :: Int,
  tryApply :: [f] -> Maybe f,
  isApplied :: [f] -> f -> Bool
}

-- пример:
ruleHypothesis :: Formula f a uo bo => f -> InfRule f
ruleHypothesis fh = InfRule {
  arity = 0,
  tryApply = tryApply',
  isApplied = isApplied'
} where
  tryApply' [] = Just fh
  tryApply' _  = Nothing
  isApplied' [] fh -> True
  isApplied' _  _  -> False

перейти потом к более правильному на основе схем формул. Их тип получился бы аналогично ShallowFormula1 «добавлением конструктора». Так что в любом случае issue имеется.

 Профиль  
                  
 
 Re: Fix, «добавление» конструкторов и деконструкция [Haskell]
Сообщение26.06.2015, 12:05 
Заслуженный участник
Аватара пользователя


06/10/08
6422
arseniiv в сообщении #1031144 писал(а):
позволяющего конструировать их единообразно. А что делать с деконструкцией? Включить в класс набор функций asAtom :: f -> Maybe a, asQuantif :: f -> (q, f) etc.? Чего-то резко забыл, как принято деконструировать ADT’ы.
Катаморфизмы же. (a -> x) -> (uo -> x -> x) -> (bo -> x -> x -> x) -> (Formula0 -> x)

Как-то я плохо понимаю этот Ваш класс Formula. Если он для формул первого порядка, то почему там не упоминается параметр для типа кванторов, как в Formula1?

 Профиль  
                  
 
 Re: Fix, «добавление» конструкторов и деконструкция [Haskell]
Сообщение26.06.2015, 12:37 
Заслуженный участник


27/04/09
28128
Xaositect в сообщении #1031155 писал(а):
Как-то я плохо понимаю этот Ваш класс Formula. Если он для формул первого порядка, то почему там не упоминается параметр для типа кванторов, как в Formula1?
Есть и инстанс Formula Formula0 Prop UnOp BinOp.

Xaositect в сообщении #1031155 писал(а):
Катаморфизмы же. (a -> x) -> (uo -> x -> x) -> (bo -> x -> x -> x) -> (Formula0 -> x)
О, спасибо. Катаморфизмы я уже даже немного использовал как раз здесь, но с конкретными типами, а в класс поместить метод как-то не догадался.

 Профиль  
                  
 
 Re: Fix, «добавление» конструкторов и деконструкция [Haskell]
Сообщение26.06.2015, 12:47 
Заслуженный участник
Аватара пользователя


06/10/08
6422
А кстати, чем квантор не унарный оператор?

 Профиль  
                  
 
 Re: Fix, «добавление» конструкторов и деконструкция [Haskell]
Сообщение26.06.2015, 13:26 
Заслуженный участник


27/04/09
28128
Хорошее замечание, :-) я как-то не усмотрел, а сейчас тоже вижу. Теперь есть что переписать и сравнить.

 Профиль  
                  
 
 Re: Fix, «добавление» конструкторов и деконструкция [Haskell]
Сообщение18.10.2019, 22:24 
Заслуженный участник


27/04/09
28128
[Time skip]

Со времени этой темы прошло сколько-то времени и я успел найти, что есть более удобный, чем Data.Fix, пакет для обобщённых свёрток, recursion-schemes. Можно определять свои типы данных нормальным образом и выводить по ним соответствующие функторы с помощью Template Haskell; можно также определять функтор и «замкнутый тип» оба отдельно (или брать например имеющиеся — допустим, Maybe и Natural) и писать для их связи несколько инстансов, которые этот пакет и использует в определении свёрток. Притом там всё так же есть и Fix, если понадобится. И ещё куча вещей, в которых я не разбираюсь, но которые могут внезапно понадобиться при обобщении кода.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

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



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

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


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

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