Skip to content

Instantly share code, notes, and snippets.

@imjacobclark
Created January 21, 2019 13:51
Show Gist options
  • Save imjacobclark/600aaa8d75f6496a90dee90cb9b0247e to your computer and use it in GitHub Desktop.
Save imjacobclark/600aaa8d75f6496a90dee90cb9b0247e to your computer and use it in GitHub Desktop.
Simple DFA in Haskell
module DFASpec (spec) where
import Test.Hspec
data State = S1 | S2 deriving (Eq, Show)
data Symbols = Zero | One deriving (Eq, Show)
data Alphabet = Alphabet [Symbols] deriving (Eq, Show)
data FiniteStates = FiniteStates [State] deriving (Eq, Show)
data DFA = DFA FiniteStates Alphabet State deriving (Eq, Show)
data Transitions = Transitions [State] deriving (Eq, Show)
start = S1
finish = S1
dead = S2
transition :: DFA -> State -> Transitions -> String -> State
transition _ S1 _ "" = S1
transition _ S1 _ "0" = S2
transition _ S1 _ "1" = S1
transition _ S2 _ "0" = S1
transition _ S2 _ "1" = S2
spec :: Spec
spec =
describe "DFA" $ do
it "a finish state is returned when given a valid input of 0 0 0 0" $ do
let dfa = DFA (FiniteStates [S1, S2]) (Alphabet [Zero, One]) start
let transition1 = transition (dfa) start (Transitions []) "0"
let transition2 = transition (dfa) transition1 (Transitions []) "0"
let transition3 = transition (dfa) transition2 (Transitions []) "0"
let transition4 = transition (dfa) transition3 (Transitions []) "0"
transition4 `shouldBe` finish
it "a finish state is returned when given a valid input of 0 0" $ do
let dfa = DFA (FiniteStates [S1, S2]) (Alphabet [Zero, One]) start
let transition1 = transition (dfa) start (Transitions []) "0"
let transition2 = transition (dfa) transition1 (Transitions []) "0"
let transition3 = transition (dfa) transition2 (Transitions []) "0"
let transition4 = transition (dfa) transition3 (Transitions []) "0"
transition4 `shouldBe` finish
it "a dead state is returned when given a invalid input of 0 1 0 0" $ do
let dfa = DFA (FiniteStates [S1, S2]) (Alphabet [Zero, One]) start
let transition1 = transition (dfa) start (Transitions []) "0"
let transition2 = transition (dfa) transition1 (Transitions []) "1"
let transition3 = transition (dfa) transition2 (Transitions []) "0"
let transition4 = transition (dfa) transition3 (Transitions []) "0"
transition4 `shouldBe` dead
it "a dead state is returned when given a invalid input of 1 1" $ do
let dfa = DFA (FiniteStates [S1, S2]) (Alphabet [Zero, One]) start
let transition1 = transition (dfa) start (Transitions []) "0"
let transition2 = transition (dfa) transition1 (Transitions []) "1"
let transition3 = transition (dfa) transition2 (Transitions []) "0"
let transition4 = transition (dfa) transition3 (Transitions []) "0"
transition4 `shouldBe` dead
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment