vocabulary <http://flandersmake.be/cdf/vocabulary/pm#> as pm {
	
	extends <http://www.w3.org/2001/XMLSchema#> as xsd
	extends <http://flandersmake.be/cdf/vocabulary/object_diagram#> as object_diagram
	extends <http://flandersmake.be/cdf/vocabulary/ftg#> as ftg

	aspect CtrlSource []
	aspect CtrlSink []
	aspect DataSource []
	aspect DataSink []
	
	relation entity CtrlFlow [
		from CtrlSource
		to CtrlSink
		forward ctrlTo
		reverse ctrlFrom
		asymmetric
		irreflexive
	]
	relation entity DataFlow [
		from DataSource
		to DataSink
		forward dataTo
		reverse dataFrom
		asymmetric
		irreflexive
	]
	
	aspect Named [
		restricts scalar property hasName to exactly 1
	]
	scalar property hasName :> object_diagram:hasField [
		domain Named
		range xsd:string
		functional
	]

	aspect element :> object_diagram:Object []
	
	concept Activity :> element, Named [
		// must have at least one of the following port types:
		restricts some relation hasPort to CtrlInputPort
		restricts some relation hasPort to CtrlOutputPort
	]
	
	relation entity IsTransformation [
		from Activity
		to ftg:Transformation
		forward isTransformation
		reverse occursAsActivity
		functional
		asymmetric
		irreflexive
	]
	
	aspect Port :> element, Named [
		restricts relation ofActivity to exactly 1
	]
	
	relation entity HasPort :> object_diagram:Link [
		from Activity
		to Port
		forward hasPort
		reverse ofActivity
		asymmetric
		irreflexive
		inverse functional
	]
	
	// Every port can only have one incoming/outgoing connection
	concept CtrlOutputPort :> CtrlSource, Port [
		restricts relation ctrlTo to exactly 1
	]
	concept CtrlInputPort :> CtrlSink, Port [
		restricts relation ctrlFrom to exactly 1
	]
	concept DataOutputPort :> DataSource, Port [
		restricts relation dataTo to exactly 1
	]
	concept DataInputPort :> DataSink, Port [
		restricts relation dataFrom to exactly 1
	]
	
	concept Start :> element, CtrlSource [
		restricts relation ctrlTo to exactly 1
	]
	concept Final :> element, CtrlSink [
		restricts relation ctrlFrom to exactly 1
	]
	
	concept Artifact :> element, Named, DataSource, DataSink [
		// an artifact must come from somewhere :)
		restricts relation dataTo to min 1
	]
	
	relation entity HasType [
		from Artifact
		to ftg:Formalism
		forward hasType
		reverse occursAsArtifact
		functional
		asymmetric
		irreflexive
	]
	
	concept ForkJoin :> element, CtrlSink, CtrlSource [
		restricts relation ctrlFrom to min 1
		restricts relation ctrlTo to min 1
	]
	
	concept Merge :> element, CtrlSink, CtrlSource [
		// Only one outgoing control flow link:
		restricts relation ctrlTo to exactly 1
	]
	
	concept Model :> object_diagram:Model [
		restricts all relation object_diagram:hasObject to element
	]
}