Documentation
This commit is contained in:
parent
887e2d63c7
commit
0f5d632388
2 changed files with 31 additions and 3 deletions
23
NFA.fs
23
NFA.fs
|
|
@ -6,16 +6,26 @@ type State = { name: String }
|
|||
|
||||
/// A non-deterministic finite automaton
|
||||
type NFA = {
|
||||
/// All possible characters
|
||||
sigma: Char list
|
||||
/// All possible states
|
||||
states: State list
|
||||
/// All possible transitions
|
||||
delta: State -> Char -> State list
|
||||
/// The state this NFA begins in
|
||||
beginState: State
|
||||
/// The states in which this NFA accepts
|
||||
/// the word
|
||||
acceptingStates: State list
|
||||
}
|
||||
|
||||
/// Returns a list of possible states after this charater
|
||||
/// was read
|
||||
let processChar (nfa: NFA) (state: State) (char: 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 =
|
||||
match charArr with
|
||||
| [] -> states
|
||||
|
|
@ -23,16 +33,23 @@ let rec processCharArray (nfa: NFA) (states: State list) (charArr: Char list) :
|
|||
processCharArray
|
||||
nfa
|
||||
(
|
||||
// Look at all states
|
||||
states
|
||||
// Where are we going to from each state
|
||||
// if we read this character
|
||||
|> List.map (fun x -> processChar nfa x head)
|
||||
// Which entries are not empty
|
||||
|> List.filter (List.isEmpty >> not)
|
||||
// If there are no states left,
|
||||
// return an empty list
|
||||
|> (fun x ->
|
||||
if not (List.isEmpty x) then
|
||||
List.reduce List.append x
|
||||
else [])
|
||||
if not (List.isEmpty x) then
|
||||
List.reduce List.append x
|
||||
else [])
|
||||
)
|
||||
tail
|
||||
|
||||
/// Returns whether this NFA accepts this word
|
||||
let acceptsWord nfa word =
|
||||
match processCharArray nfa [nfa.beginState] (Seq.toList word) with
|
||||
| [] -> false
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue