deal with subtyping between assertions

This commit is contained in:
Sam Caldwell 2020-06-12 15:27:52 -04:00
parent 7e5c8e8eb7
commit a5dd55b907
2 changed files with 41 additions and 17 deletions

View File

@ -68,28 +68,49 @@
(define (program->spin rgs) (define (program->spin rgs)
(define assertion-tys (all-assertions rgs)) (define assertion-tys (all-assertions rgs))
(define event-tys (all-events rgs)) (define event-tys (all-events rgs))
(define event-subty# (make-event-map assertion-tys event-tys))
(define all-mentioned-tys (set-union assertion-tys event-tys)) (define all-mentioned-tys (set-union assertion-tys event-tys))
(define name-env (make-name-env all-mentioned-tys)) (define name-env (make-name-env all-mentioned-tys))
(define globals (initial-assertion-vars-for all-mentioned-tys name-env)) (define globals (initial-assertion-vars-for all-mentioned-tys name-env))
(define procs (for/list ([rg rgs]) (rg->spin rg name-env))) (define procs (for/list ([rg rgs]) (rg->spin rg event-subty# name-env)))
(sprog globals procs)) (sprog globals procs))
;; RoleGraph -> SpinProcess ;; [Setof τ] [Setof τ] -> [Hashof τ [Setof τ]]
(define (rg->spin rg name-env #:name [name (gensym 'proc)]) (define (make-event-map assertion-tys event-tys)
;; TODO - potentially use non-empty intersection
(for/hash ([a (in-set assertion-tys)])
(values a
(all-supertypes-of a event-tys))))
;; τ [Setof τ] -> [Setof τ]
(define (all-supertypes-of τ tys)
(for*/set ([ty (in-set tys)]
#:when (<:? τ ty))
ty))
;; [Setof τ] [Hashof τ [Setof τ]]
(define (super-type-closure asserts event-subty#)
(for*/set ([a (in-set asserts)]
[supers (in-value (hash-ref event-subty# a))]
[τ (in-set (set-add supers a))])
τ))
;; RoleGraph [Hashof τ [Setof τ]] NameEnvironment -> SpinProcess
(define (rg->spin rg event-subty# name-env #:name [name (gensym 'proc)])
(match-define (role-graph st0 states) rg) (match-define (role-graph st0 states) rg)
(define all-events (all-event-types (in-hash-values states))) (define all-events (all-event-types (in-hash-values states)))
(define state-renaming (make-state-rename (hash-keys states))) (define state-renaming (make-state-rename (hash-keys states)))
(define states- (for/list ([st (in-hash-values states)]) (define states- (for/list ([st (in-hash-values states)])
(state->spin st states name-env state-renaming))) (state->spin st states event-subty# name-env state-renaming)))
(define st0- (hash-ref state-renaming st0)) (define st0- (hash-ref state-renaming st0))
;; ergh the invariant for when I tack on _assertions to a name is getting tricksy ;; ergh the invariant for when I tack on _assertions to a name is getting tricksy
(define st0-assertions (rename-all name-env (state-assertions (hash-ref states st0)))) (define st0-assertions (rename-all name-env (super-type-closure (state-assertions (hash-ref states st0)) event-subty#)))
(define assignment (local-variables-for st0- all-events name-env)) (define assignment (local-variables-for st0- all-events name-env))
;; TODO - states for mtype decl ;; TODO - states for mtype decl
(sproc name (hash-values-set state-renaming) assignment st0-assertions (list->set states-))) (sproc name (hash-values-set state-renaming) assignment st0-assertions (list->set states-)))
;; State [Sequenceof State] NameEnvironment [Hashof StateName SName] -> SpinState ;; State [Sequenceof State] [Hashof τ [Setof τ]] NameEnvironment [Hashof StateName SName] -> SpinState
(define (state->spin st states name-env state-env) (define (state->spin st states event-subty# name-env state-env)
(match-define (state name transitions assertions) st) (match-define (state name transitions assertions) st)
(define name- (hash-ref state-env name)) (define name- (hash-ref state-env name))
(define branches (for*/list ([(D+ txns) (in-hash transitions)] (define branches (for*/list ([(D+ txns) (in-hash transitions)]
@ -97,7 +118,7 @@
(match-define (transition effs dest) txn) (match-define (transition effs dest) txn)
(match-define (state _ _ dest-assertions) (hash-ref states dest)) (match-define (state _ _ dest-assertions) (hash-ref states dest))
(define dest- (hash-ref state-env dest)) (define dest- (hash-ref state-env dest))
(branch-on D+ assertions dest- dest-assertions effs name-env))) (branch-on D+ assertions dest- dest-assertions effs event-subty# name-env)))
(sstate name- branches)) (sstate name- branches))
;; [Setof τ] -> NameEnvironment ;; [Setof τ] -> NameEnvironment
@ -177,10 +198,10 @@
#f))) #f)))
(hash-set assign CURRENT-STATE st0)) (hash-set assign CURRENT-STATE st0))
;; D+ [Setof τ] SName [Setof τ] [Listof TransitionEffect] NameEnvironment -> SBranch ;; D+ [Setof τ] SName [Setof τ] [Listof TransitionEffect] [Hashof τ [Setof τ]] NameEnvironment -> SBranch
(define (branch-on D+ curr-assertions dest dest-assertions effs name-env) (define (branch-on D+ curr-assertions dest dest-assertions effs event-subty# name-env)
(define new-assertions (set-subtract dest-assertions curr-assertions)) (define new-assertions (super-type-closure (set-subtract dest-assertions curr-assertions) event-subty#))
(define retractions (set-subtract curr-assertions dest-assertions)) (define retractions (super-type-closure (set-subtract curr-assertions dest-assertions) event-subty#))
(define (lookup ty) (hash-ref name-env ty)) (define (lookup ty) (hash-ref name-env ty))
(define asserts (set-map new-assertions (compose assert lookup))) (define asserts (set-map new-assertions (compose assert lookup)))
(define retracts (set-map retractions (compose retract lookup))) (define retracts (set-map retractions (compose retract lookup)))
@ -212,7 +233,12 @@
'Obs_BookQuoteT_String_star 'Obs_BookQuoteT_String_star
(Struct 'BookQuoteT (list (Base 'String) (U (list (Base 'Int) (Base 'Int))))) (Struct 'BookQuoteT (list (Base 'String) (U (list (Base 'Int) (Base 'Int)))))
'BookQuoteT_String_U_Int_Int)) 'BookQuoteT_String_U_Int_Int))
(define/timeout seller-spin (rg->spin seller-rg name-env)) (define event# (hash
(Observe (Observe (Struct 'BookQuoteT (list (Base 'String) (Mk⋆)))))
(set)
(Struct 'BookQuoteT (list (Base 'String) (U (list (Base 'Int) (Base 'Int)))))
(set)))
(define/timeout seller-spin (rg->spin seller-rg event# name-env))
(check-true (sproc? seller-spin)))) (check-true (sproc? seller-spin))))
(define tab-level (make-parameter 0)) (define tab-level (make-parameter 0))
@ -294,6 +320,8 @@
(cons 'Obs (type-constructors ty (sub1 depth)))] (cons 'Obs (type-constructors ty (sub1 depth)))]
[(U tys) [(U tys)
(cons 'U (append-map (λ (ty) (type-constructors ty (sub1 depth))) tys))] (cons 'U (append-map (λ (ty) (type-constructors ty (sub1 depth))) tys))]
[(== )
(list 'star)]
[(Base name) [(Base name)
(list name)] (list name)]
[(List _) [(List _)
@ -302,8 +330,6 @@
(list 'Set)] (list 'Set)]
[(Hash _ _) [(Hash _ _)
(list 'Hash)] (list 'Hash)]
[(== )
(list 'star)]
[(internal-label _ _) [(internal-label _ _)
(raise-argument-error 'type-constructors "internal events not supported" ty)])])) (raise-argument-error 'type-constructors "internal events not supported" ty)])]))
@ -482,7 +508,6 @@
(define leader-rg (compile (parse-T (define leader-rg (compile (parse-T
'(Role ; = react '(Role ; = react
(get-quotes) (get-quotes)
(Shares (Observe (BookQuoteT String ))) ; = assert
(Reacts ; = on (Reacts ; = on
(Asserted (BookQuoteT String (Bind Int))) (Asserted (BookQuoteT String (Bind Int)))
(Branch (Branch

View File

@ -2948,7 +2948,6 @@
(define leader (define leader
'(Role ; = react '(Role ; = react
(get-quotes) (get-quotes)
(Shares (Observe (BookQuoteT String ))) ; = assert
(Reacts ; = on (Reacts ; = on
(Asserted (BookQuoteT String (Bind Int))) (Asserted (BookQuoteT String (Bind Int)))
(Branch (Branch