www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit e0f96296edc3e0071d49743c85b944720837c629
parent dee0e2f8d014a15bf9a8475ca5c73e5ea3166191
Author: Stephen Chang <stchang@ccs.neu.edu>
Date:   Mon, 18 Jul 2016 18:30:51 -0400

start fsm, (bv tests not passing)

Diffstat:
Mturnstile/examples/rosette/bv.rkt | 2+-
Aturnstile/examples/rosette/fsm.rkt | 48++++++++++++++++++++++++++++++++++++++++++++++++
Mturnstile/examples/rosette/rosette.rkt | 2+-
Aturnstile/examples/tests/rosette/fsm-test.rkt | 32++++++++++++++++++++++++++++++++
4 files changed, 82 insertions(+), 2 deletions(-)

diff --git a/turnstile/examples/rosette/bv.rkt b/turnstile/examples/rosette/bv.rkt @@ -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) diff --git a/turnstile/examples/rosette/fsm.rkt b/turnstile/examples/rosette/fsm.rkt @@ -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 ...)]]]) diff --git a/turnstile/examples/rosette/rosette.rkt b/turnstile/examples/rosette/rosette.rkt @@ -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) diff --git a/turnstile/examples/tests/rosette/fsm-test.rkt b/turnstile/examples/tests/rosette/fsm-test.rkt @@ -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$")