Я пишу базовый монадический парсер в Idris, чтобы привыкнуть к синтаксису и отличиям от Haskell. У меня есть основы, которые работают нормально, но я застрял на попытке создать экземпляры VerifiedSemigroup и VerifiedMonoid для парсера.
Без лишних слов, вот тип парсера, экземпляры Semigroup и Monoid, а также начало экземпляра VerifiedSemigroup.
data ParserM a = Parser (String -> List (a, String))
parse : ParserM a -> String -> List (a, String)
parse (Parser p) = p
instance Semigroup (ParserM a) where
p <+> q = Parser (\s => parse p s ++ parse q s)
instance Monoid (ParserM a) where
neutral = Parser (const [])
instance VerifiedSemigroup (ParserM a) where
semigroupOpIsAssociative (Parser p) (Parser q) (Parser r) = ?whatGoesHere
Я практически застрял после intros
со следующим состоянием прувера:
-Parser.whatGoesHere> intros
---------- Other goals: ----------
{hole3},{hole2},{hole1},{hole0}
---------- Assumptions: ----------
a : Type
p : String -> List (a, String)
q : String -> List (a, String)
r : String -> List (a, String)
---------- Goal: ----------
{hole4} : Parser (\s => p s ++ q s ++ r s) =
Parser (\s => (p s ++ q s) ++ r s)
-Parser.whatGoesHere>
Похоже, я смогу каким-то образом использовать rewrite
вместе с appendAssociative
, но я не знаю, как «проникнуть внутрь» лямбда \s
.
В любом случае, я застрял на части упражнения, посвященной доказательству теорем, и, похоже, я не могу найти много документации по доказательству теорем, ориентированной на Идрис. Я думаю, может быть, мне нужно начать смотреть учебники Agda (хотя Idris - это язык с зависимой типизацией, я уверен, что хочу выучить!).
funext : (f, g : a -> b) -> ((x : a) -> f x = g x) -> f = g
). К сожалению, ни Агда, ни Идрис (насколько мне известно) не могут доказать это утверждение, поэтому его следует рассматривать как аксиому. Другой вариант - ввести свое собственное понятие равенства (например,p = q <=> forall s. parse p s = parse q s
), но я не думаю, чтоVerifiedSemigroup
Идриса способен иметь дело с настраиваемым равенством. - person Vitus   schedule 07.08.2014funext = believe me
похоже на обман - опять же, мне не нужно строгое доказательство проблемы с игрушкой, которая в моих прошлых попытках на других языках могла бы иметь любые доказательства только в комментариях, если вообще. - person h.forrest.alexander   schedule 09.08.2014