-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNFA.rkt
62 lines (45 loc) · 1.78 KB
/
NFA.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#lang racket
(define (dbg v label)
(displayln label)
(displayln v)
(displayln "")
v)
(define (find-delta-tuple-char delta curr-state input)
(findf
(lambda (d) (and (equal? (car d) curr-state) (equal? (cadr d) input)))
delta))
(define (get-char-targets delta curr-state input)
(caddr (find-delta-tuple-char delta curr-state input)))
(define (get-epsilon-default lookup)
(cond
((eq? lookup #f) '())
(else (caddr lookup))))
(define (get-epsilon-targets delta curr-state)
(get-epsilon-default
(find-delta-tuple-char delta curr-state "")))
(define (finalstate? state F)
(cond
((eq? (index-of F state) #f) #f)
(else #t)))
(define (map-nfas input Sigma Q transition-states delta F)
[findf
{lambda (state) [NFA input Sigma Q state delta F]}
transition-states])
(define (check-nfa-list input Sigma Q transition-states delta F)
(not (eq? (map-nfas input Sigma Q transition-states delta F) #f)))
(define (check-base-case Sigma Q q0 delta F)
(cond
[(finalstate? q0 F) #t]
[else (check-nfa-list "" Sigma Q (get-epsilon-targets delta q0) delta F)]))
(define (check-recursive-case input Sigma Q q0 delta F)
(cond
[{check-nfa-list (substring input 1) Sigma Q (get-char-targets delta q0 (substring input 0 1)) delta F} #t]
[{check-nfa-list input Sigma Q (get-epsilon-targets delta q0) delta F} #t]
[else #f]))
(define (NFA input Sigma Q q0 delta F)
(cond
[(= (string-length input) 0) (check-base-case Sigma Q q0 delta F)]
(else (check-recursive-case input Sigma Q q0 delta F))))
(define (execute-NFA machine input)
(NFA input (first machine) (second machine) (third machine) (fourth machine) (fifth machine)))
(provide (all-defined-out))