diff --git a/networks.rkt b/networks.rkt index 217c110..860ff86 100644 --- a/networks.rkt +++ b/networks.rkt @@ -4,16 +4,24 @@ (require "utils.rkt" "functions.rkt" typed/graph racket/random) + (module+ test + (require typed/rackunit)) + (provide - State UpdateFunction DomainMapping) + State UpdateFunction DomainMapping + (struct-out network) Network) (define-type (State a) (VariableMapping a)) (define-type (UpdateFunction a) (-> (State a) a)) (define-type (DomainMapping a) (VariableMapping (Listof a))) + + (struct (a) network ([functions : (VariableMapping (UpdateFunction a))] + [domains : (DomainMapping a)]) + #:transparent + #:type-name Network) ) (require 'typed) -(provide) (require (except-in "utils.rkt" lists-transpose) (submod "utils.rkt" untyped) @@ -183,15 +191,6 @@ ;;; values in their domains. (define domain-mapping/c (hash/c variable? list?)) -;;; A network consists of a mapping from its variables to its update -;;; variables, as a well as of a mapping from its variables to -;;; their domains. -;;; -;;; The domain mapping does not have to assign domains to all -;;; variables (e.g., it may be empty), but in this case the functions -;;; which need to know the domains will not work. -(struct network (functions domains) #:transparent) - ;;; Builds a network from a given hash table assigning functions to ;;; variables by attributing Boolean domains to every variable. (define (make-boolean-network funcs) diff --git a/scribblings/networks.scrbl b/scribblings/networks.scrbl index fb61c1f..77aefb6 100644 --- a/scribblings/networks.scrbl +++ b/scribblings/networks.scrbl @@ -11,7 +11,7 @@ (parameterize ([sandbox-output 'string] [sandbox-error-output 'string] [sandbox-memory-limit 50]) - (make-evaluator 'typed/racket #:requires '("networks.rkt")))) + (make-evaluator 'typed/racket #:requires '((submod "networks.rkt" typed))))) @(define-syntax-rule (ex . args) (examples #:eval networks-evaluator . args)) @@ -48,6 +48,35 @@ their domains. } +@defstruct*[network ([functions (VariableMapping (UpdateFunction a))] + [domains (DomainMapping a)])]{ + +A network consists of a mapping from its variables to its update variables, as +a well as of a mapping from its variables to their domains. + +Instances of @racket[network] have the type @racket[Network]. + +} + +@defidform[#:kind "type" Network]{ + +The type of the instances of @racket[Network]. + +@ex[ +(: or-func (UpdateFunction Boolean)) +(define (or-func s) + (or (hash-ref s 'a) (hash-ref s 'b))) + +(: and-func (UpdateFunction Boolean)) +(define (and-func s) + (and (hash-ref s 'a) (hash-ref s 'b))) + +(network (hash 'a or-func + 'b and-func) + (hash 'a '(#f #t) + 'b '(#f #t))) +]} + @section{Syntactic description of networks} @section{Inferring interaction graphs}