vocabulary <http://ua.be/sdo2l/vocabulary/formalisms/component#> as component {
	
	extends <http://www.w3.org/2000/01/rdf-schema#> as rdfs
	extends <http://ua.be/sdo2l/vocabulary/base/base#> as base
	extends <http://bipm.org/jcgm/vim4#> as vim4

	extends <http://ua.be/sdo2l/vocabulary/formalisms/processtraces#> as traces

	@rdfs:comment "A Structural Model defines the static view of a system in terms of its components and their relationships."
	concept StructuralModel < base:IdentifiedThing, traces:Artifact//, base:WorkflowArtifact
	
	@rdfs:comment "A Structural Model is specified by several components."
	relation entity Specifies [
		from StructuralModel
		to Component
		forward specifies
		reverse isSpecifiedBy
		inverse functional
		asymmetric
		irreflexive
	]
	
	// Definitions for Components
	
	@rdfs:comment "A Component is something that can be designed in a structural model."
	concept Component < base:IdentifiedThing, base:ContainedElement, vim4:Object
	
	@rdfs:comment "A component may have several attributes."
	concept Attribute < base:IdentifiedThing, vim4:InherentUnitaryQuantityValue [
		restricts all  vim4:characterizes to Component
	]
	
	@rdfs:comment "An Interface represents a set of features that describe some Component’s interaction with another Component."
	concept Interface < base:IdentifiedThing
	
	@rdfs:comment "A Component presents zero or more Interfaces."
	relation entity Presents [
		from Component
		to Interface
		forward presents
		reverse isPresentedBy
		inverse functional
		asymmetric
		irreflexive
	]
	
	@rdfs:comment "A Junction joins two or more Interfaces."
	relation entity Junction  [
		from Interface
		to Interface
		forward joins
		symmetric
		irreflexive
	]< base:IdentifiedThing
	
	@rdfs:comment "A Component connects to zero or more components."
	relation entity Connection [
		from Component
		to Component
		forward connectsTo
		symmetric
	]
	
	@rdfs:comment "When interfaces presented by components are joined, we infer that the components are connected."
	rule Junction-infers-Connection [
		presents(c1, i1) & joins(i1, i2) & isPresentedBy(i2, c2) -> connectsTo(c1, c2)
	]
	
	// Domain-Specific Components
	
	concept CarComponent < Component
	
	concept WheelComponent < Component
	
	
}