1
Fork 0
mirror of https://github.com/Jaxan/nominal-lstar.git synced 2025-04-27 14:47:45 +02:00

Adds more example on residual languages

This commit is contained in:
Joshua Moerman 2020-05-25 16:40:46 +02:00
parent df7a45fb69
commit 2f88417749
5 changed files with 121 additions and 2 deletions

View file

@ -16,6 +16,8 @@ executable NominalAngluin
Examples.Contrived, Examples.Contrived,
Examples.ContrivedNFAs, Examples.ContrivedNFAs,
Examples.Fifo, Examples.Fifo,
Examples.NonResidual,
Examples.Residual,
Examples.RunningExample, Examples.RunningExample,
Examples.Stack, Examples.Stack,
NLStar, NLStar,
@ -46,6 +48,8 @@ executable NominalAngluin2
Examples.Contrived, Examples.Contrived,
Examples.ContrivedNFAs, Examples.ContrivedNFAs,
Examples.Fifo, Examples.Fifo,
Examples.NonResidual,
Examples.Residual,
Examples.RunningExample, Examples.RunningExample,
Examples.Stack, Examples.Stack,
NLStar, NLStar,

View file

@ -3,6 +3,8 @@ module Examples
, module Examples.Contrived , module Examples.Contrived
, module Examples.ContrivedNFAs , module Examples.ContrivedNFAs
, module Examples.Fifo , module Examples.Fifo
, module Examples.NonResidual
, module Examples.Residual
, module Examples.RunningExample , module Examples.RunningExample
, module Examples.Stack , module Examples.Stack
) where ) where
@ -10,6 +12,8 @@ module Examples
import Examples.Contrived import Examples.Contrived
import Examples.ContrivedNFAs import Examples.ContrivedNFAs
import Examples.Fifo import Examples.Fifo
import Examples.NonResidual
import Examples.Residual
import Examples.RunningExample import Examples.RunningExample
import Examples.Stack import Examples.Stack
import NLambda (Atom) import NLambda (Atom)

View file

@ -0,0 +1,42 @@
{-# language DeriveAnyClass #-}
{-# language DeriveGeneric #-}
module Examples.NonResidual where
{- The language { u d e v d f | u,v words and d,e,f atoms such that e!=f }
This should be non-guessing and non-residual 5-state NFA.
This cannot be learned by NL*, because the poset of residual languages
is too complicated. (It is not generated by an orbit-finite set of
join-irreducible elements.)
-}
import NLambda
import GHC.Generics (Generic)
import Prelude (Eq, Ord, Show)
import qualified Prelude ()
-- Parametric in the alphabet, because why not?
data NonResidual a = Q1 | Q2 a | Q3 a a | Q4 a | Q5
deriving (Eq, Ord, Show, Generic, NominalType, Contextual)
exampleNonResidual :: Automaton (NonResidual Atom) Atom
exampleNonResidual = automaton
-- state space
(fromList [Q1, Q5]
`union` map Q2 atoms
`union` map Q4 atoms
`union` pairsWith Q3 atoms atoms)
-- alphabet
atoms
-- transition relation
(map (\d -> (Q1, d, Q1)) atoms
`union` map (\d -> (Q1, d, Q2 d)) atoms
`union` pairsWith (\d e -> (Q2 d, e, Q3 d e)) atoms atoms
`union` triplesWith (\d e f -> (Q3 d e, f, Q3 d e)) atoms atoms atoms
`union` pairsWith (\d e -> (Q3 d e, d, Q4 e)) atoms atoms
`union` pairsWithFilter (\e f -> maybeIf (e `neq` f) (Q4 e, f, Q5)) atoms atoms)
-- initial states
(singleton Q1)
-- final states
(singleton Q5)

63
src/Examples/Residual.hs Normal file
View file

@ -0,0 +1,63 @@
{-# language DeriveAnyClass #-}
{-# language DeriveGeneric #-}
module Examples.Residual
( exampleResidual1
, exampleResidual2
) where
import Examples.Fifo (DataInput (..))
import NLambda
import GHC.Generics (Generic)
import Prelude (Eq, Ord, Read, Show)
import qualified Prelude ()
data Res1 a = QR1 a | QR2 | QAncStar
deriving (Eq, Ord, Show, Generic, NominalType, Contextual)
exampleResidual1 :: Automaton (Res1 Atom) DataInput
exampleResidual1 = automaton
-- state space
(fromList [QR2, QAncStar]
`union` map QR1 atoms)
-- alphabet
(map Put atoms `union` map Get atoms)
-- transition relation
(map (\a -> (QR1 a, Get a, QR1 a)) atoms
`union` pairsWithFilter (\a b -> maybeIf (a `neq` b) (QR1 a, Put b, QR1 a)) atoms atoms
`union` map (\a -> (QR1 a, Put a, QR2)) atoms
`union` map (\a -> (QAncStar, Put a, QAncStar)) atoms)
-- initial states
(map QR1 atoms `union` singleton QAncStar)
-- final states
(fromList [QR2, QAncStar])
-- Example when learning breaks
data Res2 a = Guess a | GuessConfused a | Accept
deriving (Eq, Ord, Show, Generic, NominalType, Contextual)
data AlphabetR a = A a | Anc a
deriving (Eq, Ord, Show, Read, Generic, NominalType, Contextual)
exampleResidual2 :: Automaton (Res2 Atom) (AlphabetR Atom)
exampleResidual2 = automaton
-- state space
(singleton Accept
`union` map Guess atoms
`union` map GuessConfused atoms)
-- alphabet
(map Anc atoms `union` map A atoms)
-- transition relation
(map (\a -> (Guess a, A a, Accept)) atoms
`union` map (\a -> (GuessConfused a, A a, Accept)) atoms
`union` map (\a -> (Guess a, Anc a, Accept)) atoms
`union` map (\a -> (GuessConfused a, Anc a, Accept)) atoms
`union` pairsWithFilter (\a b -> maybeIf (a `neq` b) (Guess a, A b, Guess a)) atoms atoms
`union` pairsWithFilter (\a b -> maybeIf (a `neq` b) (GuessConfused a, A b, GuessConfused a)) atoms atoms
`union` pairsWithFilter (\a b -> maybeIf (a `neq` b) (Guess a, Anc b, GuessConfused a)) atoms atoms
`union` map (\a -> (GuessConfused a, A a, Guess a)) atoms)
-- initial states
(map Guess atoms)
-- final states
(fromList [Accept])

View file

@ -12,13 +12,16 @@ import NLambda
import Prelude hiding (map) import Prelude hiding (map)
data Learner = NomLStar | NomLStarCol | NomNLStar data Learner
= NomLStar -- nominal L* for nominal automata
| NomLStarCol -- nominal L* with counterexamples as columns (suffix closed)
| NomNLStar -- NL* for nominal automata, counterexamples as columns (suffix closed)
deriving (Show, Read) deriving (Show, Read)
data Teacher = EqDFA | EqNFA Int data Teacher = EqDFA | EqNFA Int
deriving (Show, Read) deriving (Show, Read)
data Aut = Fifo Int | Stack Int | Running Int | NFA1 | Bollig Int data Aut = Fifo Int | Stack Int | Running Int | NFA1 | Bollig Int | NonResidual | Residual1 | Residual2
deriving (Show, Read) deriving (Show, Read)
-- existential wrapper -- existential wrapper
@ -32,6 +35,9 @@ mainExample learnerName teacherName autName = do
Running n -> A $ Examples.runningExample atoms n Running n -> A $ Examples.runningExample atoms n
NFA1 -> A $ Examples.exampleNFA1 NFA1 -> A $ Examples.exampleNFA1
Bollig n -> A $ Examples.exampleNFA2 n Bollig n -> A $ Examples.exampleNFA2 n
NonResidual -> A $ Examples.exampleNonResidual
Residual1 -> A $ Examples.exampleResidual1
Residual2 -> A $ Examples.exampleResidual2
let teacher = case read teacherName of let teacher = case read teacherName of
EqDFA -> teacherWithTarget automaton EqDFA -> teacherWithTarget automaton
EqNFA k -> teacherWithTargetNonDet k automaton EqNFA k -> teacherWithTargetNonDet k automaton