Created
January 21, 2019 13:51
-
-
Save imjacobclark/600aaa8d75f6496a90dee90cb9b0247e to your computer and use it in GitHub Desktop.
Simple DFA in Haskell
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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