Documentation

This commit is contained in:
joachimschmidt557 2019-02-20 19:00:48 +01:00
parent 887e2d63c7
commit 0f5d632388
2 changed files with 31 additions and 3 deletions

11
DFA.fs
View file

@ -8,10 +8,16 @@ type State = { name: String }
/// A deterministic finite automaton /// A deterministic finite automaton
/// ///
type DFA = { type DFA = {
/// All possible characters
sigma: Char list sigma: Char list
/// All possible states
states: State list states: State list
/// All possible transitions
delta: State -> Char -> State delta: State -> Char -> State
/// The state this DFA begins in
beginState: State beginState: State
/// The states in which this DFA accepts
/// the word
acceptingStates: State list acceptingStates: State list
} }
@ -43,14 +49,19 @@ let validateDFA (dfa:DFA) =
allAcceptingStatesAreStates || allAcceptingStatesAreStates ||
deltaIsComplete deltaIsComplete
/// Returns the state the DFA is in after
/// reading this character
let processChar (dfa: DFA) (state: State) (char: Char) = let processChar (dfa: DFA) (state: State) (char: Char) =
dfa.delta state char dfa.delta state char
/// Returns the state the DFA is in after
/// reading this character array
let rec processCharArray (dfa: DFA) (state: State) (charArr: Char list) = let rec processCharArray (dfa: DFA) (state: State) (charArr: Char list) =
match charArr with match charArr with
| [] -> state | [] -> state
| head :: tail -> processCharArray dfa (processChar dfa state head) tail | head :: tail -> processCharArray dfa (processChar dfa state head) tail
/// Returns whether the DFA accepts this word
let acceptsWord (dfa: DFA) (word: String) = let acceptsWord (dfa: DFA) (word: String) =
dfa.acceptingStates dfa.acceptingStates
|> List.contains (processCharArray dfa dfa.beginState (Seq.toList word)) |> List.contains (processCharArray dfa dfa.beginState (Seq.toList word))

23
NFA.fs
View file

@ -6,16 +6,26 @@ type State = { name: String }
/// A non-deterministic finite automaton /// A non-deterministic finite automaton
type NFA = { type NFA = {
/// All possible characters
sigma: Char list sigma: Char list
/// All possible states
states: State list states: State list
/// All possible transitions
delta: State -> Char -> State list delta: State -> Char -> State list
/// The state this NFA begins in
beginState: State beginState: State
/// The states in which this NFA accepts
/// the word
acceptingStates: State list acceptingStates: State list
} }
/// Returns a list of possible states after this charater
/// was read
let processChar (nfa: NFA) (state: State) (char: Char) = let processChar (nfa: NFA) (state: State) (char: Char) =
nfa.delta state char nfa.delta state char
/// Returns a list of possible states after this character
/// list was read
let rec processCharArray (nfa: NFA) (states: State list) (charArr: Char list) : State list = let rec processCharArray (nfa: NFA) (states: State list) (charArr: Char list) : State list =
match charArr with match charArr with
| [] -> states | [] -> states
@ -23,16 +33,23 @@ let rec processCharArray (nfa: NFA) (states: State list) (charArr: Char list) :
processCharArray processCharArray
nfa nfa
( (
// Look at all states
states states
// Where are we going to from each state
// if we read this character
|> List.map (fun x -> processChar nfa x head) |> List.map (fun x -> processChar nfa x head)
// Which entries are not empty
|> List.filter (List.isEmpty >> not) |> List.filter (List.isEmpty >> not)
// If there are no states left,
// return an empty list
|> (fun x -> |> (fun x ->
if not (List.isEmpty x) then if not (List.isEmpty x) then
List.reduce List.append x List.reduce List.append x
else []) else [])
) )
tail tail
/// Returns whether this NFA accepts this word
let acceptsWord nfa word = let acceptsWord nfa word =
match processCharArray nfa [nfa.beginState] (Seq.toList word) with match processCharArray nfa [nfa.beginState] (Seq.toList word) with
| [] -> false | [] -> false