-
Notifications
You must be signed in to change notification settings - Fork 1
Description
I can write code which type checks for these instances (see below) but I need to explore what the correlations are and what the interpretation should be to operations on regular languages. For example, contramap is quite close to the definition of inverse homomorphism of a regular language (a constructive proof is typically given for DFA), except that the morphism function is usually given in textbooks as (s → [g]) or sometimes equivalently ([s] → [g]). I'm not sure it's okay to say contramap would suffice for invhom despite being polymorphic because morphisms which "erase" might be troublesome. Even if we let the co-domain of h be some finite list type for example, I think it would still need a way to concat, or perhaps it would not matter, I'll have to think more about that.
instance Contravariant (DA q) where
contramap ∷ (s → g) → DA q g → DA q s
contramap h m@(DA _ t) = m { transition = \q → t q . h }
-- some ideas to consider (non-exhaustive):
-- https://en.wikipedia.org/wiki/Krohn%E2%80%93Rhodes_theory
-- https://liacs.leidenuniv.nl/~hoogeboomhj/second/secondcourse.pdf
-- https://is.muni.cz/th/jz845/bachelor-thesis.pdf
-- https://drona.csa.iisc.ac.in/~deepakd/atc-2015/algebraic-automata.pdf
-- http://www.cs.nott.ac.uk/~psarb2/MPC/FactorGraphsFailureFunctionsBiTrees.pdf
-- https://cstheory.stackexchange.com/questions/40920/generalisation-of-the-statement-that-a-monoid-recognizes-language-iff-syntactic
instance Divisible (DA q) where
divide ∷ (s → (g₁, g₂)) → DA q g₁ → DA q g₂ → DA q s
divide f (DA o₁ t₁) (DA o₂ t₂) = DA { output = undefined -- \q → o₁ q ∧ o₂ q -- or even something way more complicated!
, transition = undefined -- \q s → case f s of (b, c) → t₂ (t₁ q b) c -- remember that the types also allow composition in the other direction too!
-- , transition = \q s → uncurry (t₂ . t₁ q) (f s)
--, transition = \q → uncurry (t₂ . t₁ q) . f
}
conquer ∷ DA q a
conquer = DA { output = const True
, transition = const
}
instance Decidable (DA q) where
lose ∷ (a → Void) → DA q a
lose _ = empty
choose ∷ (s → Either g₁ g₂) → DA q g₁ → DA q g₂ → DA q s
choose f (DA o₁ t₁) (DA o₂ t₂) = DA { output = undefined -- \q → o₁ q ∨ o₂ q
, transition = undefined -- \q → either (t₁ q) (t₂ q) . f
}
May also want to consider making a data type for semi automata in case there are multiple good interpretations each with different output definitions. But that is just speculation for now.