start fsm, (bv tests not passing)
This commit is contained in:
parent
dee0e2f8d0
commit
e0f96296ed
|
@ -1,5 +1,5 @@
|
|||
#lang turnstile
|
||||
(extends "rosette.rkt" #:except bv)
|
||||
(extends "rosette.rkt" #:except bv) ; extends typed rosette
|
||||
(require (prefix-in ro: rosette)) ; untyped
|
||||
(require (except-in "rosette.rkt" #%app define)) ; typed
|
||||
(require (only-in sdsl/bv/lang/bvops bvredand bvredor)
|
||||
|
|
48
turnstile/examples/rosette/fsm.rkt
Normal file
48
turnstile/examples/rosette/fsm.rkt
Normal file
|
@ -0,0 +1,48 @@
|
|||
#lang turnstile
|
||||
(extends "rosette.rkt"); #:except →) ; extends typed rosette
|
||||
(require (prefix-in ro: rosette)) ; untyped
|
||||
(require (prefix-in ro: rosette/lib/synthax))
|
||||
;; (require (except-in "rosette.rkt" #%app define)) ; typed
|
||||
;; (require (only-in sdsl/bv/lang/bvops bvredand bvredor)
|
||||
(require (prefix-in fsm: sdsl/fsm/fsm))
|
||||
;(require (prefix-in fsm: (only-in sdsl/fsm/automaton automaton)))
|
||||
;; ;(require (only-in sdsl/fsm/fsm automaton))
|
||||
;; ;; (require sdsl/bv/lang/core (prefix-in bv: sdsl/bv/lang/form))
|
||||
|
||||
(define-base-types FSM Regexp State)
|
||||
|
||||
(define-typed-syntax pregexp
|
||||
[(_ s) ≫
|
||||
[⊢ [[s ≫ s-] ⇐ : String]]
|
||||
--------
|
||||
[⊢ [[_ ≫ (pregexp- s-)] ⇒ : Regexp]]])
|
||||
|
||||
|
||||
|
||||
(define-typed-syntax automaton #:datum-literals (: →)
|
||||
[(_ init-state:id
|
||||
[state:id : (label:id → target) ...] ...) ≫
|
||||
[#:fail-unless (member (syntax->datum #'init-state)
|
||||
(syntax->datum #'(state ...)))
|
||||
(format "initial state ~a is not declared state: ~a"
|
||||
(syntax->datum #'init-state)
|
||||
(syntax->datum #'(state ...)))]
|
||||
#;[#:fail-unless (let ([states (syntax->datum #'(state ...))])
|
||||
(for/and ([t (syntax->datum #'(target ... ...))])
|
||||
(member t states)))
|
||||
(format "transition to unknown state")]
|
||||
[#:with arr (datum->syntax #f '→)]
|
||||
[() ([state : State ≫ state-] ...) ⊢
|
||||
[[init-state ≫ init-state-] ⇐ : State]
|
||||
[[target ≫ target-] ⇐ : State] ... ...]
|
||||
--------
|
||||
[⊢ [[_ ≫ (fsm:automaton init-state-
|
||||
[state- : (label arr target-) ...] ...)]
|
||||
⇒ : FSM]]])
|
||||
|
||||
|
||||
(define-typed-syntax ?
|
||||
[(_ e ...+) ≫
|
||||
[⊢ [[e ≫ e-] ⇒ : ty]] ...
|
||||
--------
|
||||
[⊢ [[_ ≫ (ro:choose e ...)] ⇒ : (⊔ ty ...)]]])
|
|
@ -99,7 +99,7 @@
|
|||
(define-type-alias BVPred (→ BV Bool))
|
||||
|
||||
;; TODO: fix me --- need subtyping?
|
||||
(define-type-alias Nat Int)
|
||||
(define-syntax Nat (make-rename-transformer #'Int))
|
||||
|
||||
;; TODO: support higher order case --- need intersect types?
|
||||
;(define-rosette-primop bv : (→ Int BVPred BV)
|
||||
|
|
32
turnstile/examples/tests/rosette/fsm-test.rkt
Normal file
32
turnstile/examples/tests/rosette/fsm-test.rkt
Normal file
|
@ -0,0 +1,32 @@
|
|||
#lang s-exp "../../rosette/fsm.rkt"
|
||||
(require "../rackunit-typechecking.rkt")
|
||||
|
||||
(define m
|
||||
(automaton init
|
||||
[init : (c → more)]
|
||||
[more : (a → more)
|
||||
(d → more)
|
||||
(r → end)]
|
||||
[end : ]))
|
||||
|
||||
(define rx (pregexp "^c[ad]+r$"))
|
||||
|
||||
|
||||
(define M
|
||||
(automaton init
|
||||
[init : (c → (? s1 s2))]
|
||||
[s1 : (a → (? s1 s2 end reject))
|
||||
(d → (? s1 s2 end reject))
|
||||
(r → (? s1 s2 end reject))]
|
||||
[s2 : (a → (? s1 s2 end reject))
|
||||
(d → (? s1 s2 end reject))
|
||||
(r → (? s1 s2 end reject))]
|
||||
[end : ]))
|
||||
|
||||
;; ; example commands
|
||||
;; (m '(c a r))
|
||||
;; (m '(c d r))
|
||||
;; (m '(c a d a r))
|
||||
;; (verify-automaton m #px"^c[ad]+r$")
|
||||
;; (debug-automaton m #px"^c[ad]+r$" '(c r))
|
||||
;; (synthesize-automaton M #px"^c[ad]+r$")
|
Loading…
Reference in New Issue
Block a user