BNGSOS

From BioNetWiki

Jump to: navigation, search

Structured Operational Semantics (SOS) description of the BioNetGen language

Ed Clarke, Sumit Kumar Jha and Chris Langmead,
Carnegie Mellon University

James Faeder
University of Pittsburgh

Contents

Abstract Syntax for BioNetGen

  • container = New-Container (name, compartment, list-of-states, binding-state, tree-of-containers)
  • container-selector = New-Container-Selector ( name, compartment, list-of-states, binding-state, tree-of-containers )
  • container-match = container.Match ( container-selector )
  • container = container.getmatch(container-selector).selector-element
  • Add-Bond ( container1, container2 )
  • Delete-Bond (container1, container2 )
  • container.Change-State ( state-name, new-state )
  • container.clone()



.


Semantics of BioNetGen

container = New-Container (name, compartment, list-of-states, binding-state, tree-of-containers)

name:String, compartment: String, binding-state:Boolean

list-of-states = state1::state2::...::staten

state1: (String, String), .... , staten: (String,String)

tree: Tree of containers


[container = New-Container (name, compartment, state1::state2::...::staten, binding-state, tree), σ] --> [ {container : Container = < name, compartment, state1::state2::...::staten, binding-state, tree > }, σ ]



.

container-selector = New-Container-Selector ( name, compartment, list-of-states, binding-state, tree-of-containers )

name: String \cup { * }

compartment: String \cup { * }

list-of-states: state1::state2::...::statem

binding-state: Boolean \cup { * }

tree: Tree of ( Containers \cup { * } )



[ container-selector = New-Container-Selector ( name, compartment, state1::state2::...::statem, binding-state, tree ) , σ ] = [ { container-selector: Container-Selector = < name, compartment, state1::state2::...::statem, binding-state, tree > } , σ ]



.

container.Match ( container-selector)

container-selector: Container-Selector = < name, compartment, list-of-states, binding-state, tree, bond1::bond2::...::bondn >

container : Container = < name', compartment', list-of-states', binding-state', tree' >

tree-match = tree.match ( tree' )

name-match = name.match ( name' )

compartment-match = compartment.match ( compartment' )

list-of-states' = list-of-states :: Extra-state-list

bondi = ( componenti1, componenti2 )

Global-Bond-List := bond1::bond2::...::bondn::ExtraBondList

binding-state-match = binding-state. match ( binding-state' )

tree-match != NULL & name-match  != NULL & compartment-match  != NULL & state-match  != NULL & binding-state-match  != NULL


[ container.match( container-selector ) , σ ] --> [ { container-match : container-match = < tree-match, name-match, compartment-match, state-match, binding-state-match > } , σ ]



.


str: String

str': String

str = str'


[ str'.match (str) , σ ] = [ { string-match : string-match = < str, str' > } , σ ]




str: String

str': *


[ str'.match (str) , σ ] = [ { string-match : string-match = < str, * > } , σ ]




.


str: String

str': String

str != str'


[ str'.match (str) , σ ] = [ { string-match : string-match = NULL }, σ ]



.



tree  : Tree = < root, tree1 :: tree2 :: ... :: treen >

tree' : Tree = < root', [] >

root' = *


[ tree'.match (tree) , σ ] = [ { tree-match : tree-match = { <root,root'> } } , σ ]



.


tree  : Tree = < root, tree1 :: tree2 :: ... :: treen >

tree' : Tree = < root', tree'1 :: tree'2 :: ... :: tree'm >

root' = *

m <= n


( (match1 := tree'1.match(tree1)) != NULL) & ( (match2 := tree'2.match(tree2)) != NULL) .... & ( (matchm := tree'm.match(treem)) != NULL)


[ tree'.match (tree) , σ ] = [ { tree-match : tree-match = { <root,root'> } \cup \bigcup {match1, ....., matchm} > } } , σ ]


(The above assumes that there are rules available that allow reordering of lists)



.


tree  : Tree = < root, tree1 :: tree2 :: ... :: treen >

tree' : Tree = < root', tree'1 :: tree'2 :: ... :: tree'm >

root' = *

m <= n


\bigwedge_{\pi} \bigvee_{i} tree'π (i).match(treei) == NULL


[ tree'.match (tree) , σ ] = [ { tree-match : tree-match = NULL } , σ ]


tree  : Tree = < root, tree1 :: tree2 :: ... :: treen >

tree' : Tree = < root', tree'1 :: tree'2 :: ... :: tree'm >

root' != *

m > n


[ tree'.match (tree) , σ ] = [ { tree-match : tree-match = NULL } , σ ]


.


tree  : Tree = < root, tree1 :: tree2 :: ... :: treen >

tree' : Tree = < root', tree'1 :: tree'2 :: ... :: tree'm >

root' != *

n == m

root != root'


[ tree'.match (tree) , σ ] = [ { tree-match : tree-match = NULL } , σ ]



.

tree  : Tree = < root, tree1 :: tree2 :: ... :: treen >

tree' : Tree = < root', tree'1 :: tree'2 :: ... :: tree'm >

root' != *

m <= n

root == root'

(match1= tree'1.match(tree1) != NULL) & (match2= tree'2.match(tree2) != NULL) .... & (matchm= tree'm.match(treem) != NULL)


[ tree'.match (tree) , σ ] = [ { tree-match : tree-match = { <root,root'> } \cup \bigcup {match1, ....., matchm} > } , σ ]


(The above assumes that there are rules available that allow reordering of lists)



.



tree  : Tree = < root, tree1 :: tree2 :: ... :: treen >

tree' : Tree = < root', tree'1 :: tree'2 :: ... :: tree'm >

root' != *

m <= n

root == root'

\bigwedge_{\pi} \bigvee_{i} tree'π (i).match(treei) == NULL


[ tree'.match (tree) , σ ] = [ { tree-match : tree-match = NULL } , σ ]



.

container-match.getMatch (selector-element)

container-match = < tree-match, name-match, compartment-match, state-match, binding-state-match >

tree-match = { <selector-element1, container-element1> , <selector-element2, container-element2> ..... <selector-elementn, container-elementn> }

selector-element = selector-elementi


[ container-match.getMatch (selector-element) , σ ] = [ { container-elementi } , σ ]



.


Add-Bond (container1, container2)

Global-Bond-List = < bond1::bond2::...::bondn >

new-bond := (container1,container2)


[ AddBond (container1, container2) , σ ] = [ { Global-Bond-List = < bond1::bond2::...::bondn::new-bond >}, σ ]


.

Delete-Bond (container1, container2)

Global-Bond-List = < bond1::bond2::...::bondn >

bond1 := (container1,container2)



[ Delete-Bond (container1, container2) , σ ] = [ { Global-Bond-List = < bond2::bond3::...::bondn > } , σ ]



.

container.Change-State (state-name, new-state-value)

container = < name, compartment, state1::state2::...::staten, binding-state, tree >

state1 = ( name, value )

name = state-name



[ container.Change-State (state-name, new-state) , σ ] = [ { container = < name, compartment, ( state-name, new-state-value )::state2::...::staten, binding-state, tree > }, σ ]



container.clone()

container : Container = < name, compartment, list-of-states, binding-state, tree >


[ container.clone() , σ ] --> [ { new-container : Container = < name, compartment, list-of-states, binding-state, tree > } , σ ]

Personal tools