-
Notifications
You must be signed in to change notification settings - Fork 9
/
apdx-validation.tex
840 lines (601 loc) · 66.9 KB
/
apdx-validation.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
\newcounter{sbolCtr}
\newcommand{\printValid}{\validRule{sbol3-\arabic{sbolCtr}\addtocounter{sbolCtr}{1}}}
\newcommand{\printComplete}{\completeRule{sbol3-\arabic{sbolCtr}\addtocounter{sbolCtr}{1}}}
\newcommand{\printWarning}{\consistencyRule{sbol3-\arabic{sbolCtr}\addtocounter{sbolCtr}{1}}}
\newcommand{\printModeling}{\modelingRule{sbol3-\arabic{sbolCtr}\addtocounter{sbolCtr}{1}}}
\section{Validation Rules}
\label{validation}
This section summarizes all the conditions that either MUST be or
are RECOMMENDED to be true of an SBOL Version~3.0 document. There are different degrees of rule strictness.
Rules of the former kind are strict SBOL validation rules---data encoded in SBOL MUST conform to
all of them in order to be considered valid. Rules of the latter kind
are consistency rules that SBOL data are RECOMMENDED to adhere to as a best practice. To help highlight these differences, we use the
following symbols next to the rule numbers:
\begin{description}
\item[\hspace*{6.5pt}\vSymbol\vsp] A \vSymbolName indicates a strong
REQUIRED condition for SBOL conformance. If an SBOL document does not follow this rule, it does not conform to the SBOL
specification.
%(Mnemonic intention behind the choice of symbol: ``This MUST be checked.'')
\item[\hspace*{6.5pt}\rSymbol\rsp] A \rSymbolName indicates a weak
REQUIRED condition for SBOL conformance. While this rule MUST be followed, there are conditions under which it can only be partially checked by a machine (e.g., due to references to data that is not accessible or data with an ambiguous format).
Rules of this type SHOULD be checked insofar as is possible given the information available in an SBOL document.
% (Mnemonic intention behind the choice of symbol: ``Usually requires a complete document.'')
\item[\hspace*{6.5pt}\mSymbol\msp] A \mSymbolName indicates a
RECOMMENDED condition for following best practices. This rule is not strictly a matter of SBOL conformance, but its recommendation comes from logical
reasoning. If an SBOL document does not follow this rule, it is still valid SBOL, but it might have degraded functionality in some tools.
% (Mnemonic intention behind the choice of symbol: ``You're a star if you heed this.'')
\end{description}
We also include a fourth type of rule that represents a required condition for SBOL-compliance that cannot be checked by a machine. Therefore, violations of these rules are not expected to be reported as errors by any of the software libraries implementing SBOL 3.0. It is the user's responsibility to make sure that these validation rules are followed.
\begin{description}
\item[\hspace*{6.5pt}\cSymbol\csp] A \cSymbolName indicates a weak REQUIRED condition for SBOL conformance. While this rule MUST be followed, it is not possible in practice for a machine to automatically check whether the rule has been followed.
% (Mnemonic intention behind the choice of symbol: ``This is a cause for warning.'')
\end{description}
The validation rules listed in the following subsections are all believed to be
stated or implied in the rest of this specification document. They
are enumerated here for convenience and to provide a ``master
checklist'' for SBOL validation. In case of a conflict between this
section and other portions of the specification (though there are believed to
be none), this section is considered authoritative for the purpose of
determining the validity of an SBOL document.
Not \notice all classes have validation rules specific to that class.
For classes whose validation is covered by the rules for all SBOL objects, the type is not explicitly listed below.
A range in the validation rules numbers, however, has been reserved in case of future need.
%% This \token{sbol:x} format doesn't get used anywhere, so it is removed for now.
%For \notice convenience and brevity, we use the shorthand
%``\token{sbol:x}'' to stand for an attribute or element name \token{x}
%in the namespace for the SBOL specification, using
%the namespace prefix \token{sbol}. In reality, the prefix string can be different from the literal ``\token{sbol}'' used here (and indeed, it can be any valid XML namespace prefix that the software
%chooses). We use ``\token{sbol:x}'' because it is shorter than to
%write a full explanation everywhere we refer to an attribute or element
%in the SBOL specification namespace.
\subsubsection*{Rules for SBOL Objects}
\setcounter{sbolCtr}{10101}
\printComplete{The IRI of an \sbol{Identified} object MUST be globally unique. \\
Reference: \sec{sec:IRIstructure}}
\printValid{A \sbol{TopLevel} URL MUST use the following pattern:
\texttt{[namespace]/[local]/[displayId]}, where \texttt{namespace} and \sbol{displayId} are required fragments, and the \texttt{local} fragment is an optional relative path.\\
Reference: \sec{sec:IRIstructure}}
\printValid{A \sbol{TopLevel} object's URL MUST NOT be included as prefix for any other \sbol{TopLevel} object.\\
Reference: \sec{sec:IRIstructure}}
\printValid{The URL of any child or nested object MUST use the following pattern:\texttt{[parent]/[displayId]}, where \texttt{parent} is the URL of its parent object.
Multiple layers of child objects are allowed, using the same \texttt{[parent]/[displayId]} pattern recursively.\\
Reference: \sec{sec:IRIstructure}}
\printValid{The SBOL namespace MUST NOT be used for any entities or properties not defined in this specification.\\
Reference: \sec{sec:sbolURLs}}
\printValid{An object MUST NOT have \external{rdfType} properties in the \uri{http://sbols.org/v3\#} namespace that refer to disjoint classes.\\
Reference: \sec{sec:sbolTypes}}
\printModeling{An object SHOULD have no more than one \external{rdfType} property in the \uri{http://sbols.org/v3\#} namespace.\\
Reference: \sec{sec:sbolTypes}}
\printModeling{If an object has a property in the \uri{http://sbols.org/v3\#} namespace (e.g., \texttt{sbol:displayId}, then it SHOULD also have an \external{rdfType} property in that namespace.\\
Reference: \sec{sec:sbolTypes}}
\printValid{An object MUST NOT have properties in the \uri{http://sbols.org/v3\#} namespace other than those listed for its type or parent types in \ref{t:allowed_properties}.\\
Reference: \sec{sec:sbolURLs}}
\printValid{An object MUST have a number of instances of a property that matches the cardinality restrictions listed for that object type and property in \ref{t:property_cardinality_type}.\\
Reference: \sec{sec:umldiagrams}}
\printValid{An object's property values MUST have the type listed for the object type and property in \ref{t:property_cardinality_type}.\\
Reference: \sec{sec:datatypes}}
\printValid{Each property of type \sbol{IRI} that is listed with a reference type in \ref{t:property_cardinality_type} MUST refer to an object of the type listed (child objects).\\
Reference: \sec{sec:datatypes}}
% This is true for both TopLevel and child objects. It can always be checked for child objects, but for TopLevel only those accessible
\printComplete{Each property of type \sbol{IRI} that is listed with a reference type in \ref{t:property_cardinality_type} MUST refer to an object of the type listed.\\
Reference: \sec{sec:datatypes}}
% references should be accessible, if possible
\printModeling{Each property of type \sbol{IRI} that is listed with a \sbol{TopLevel} reference type in \ref{t:property_cardinality_type} SHOULD be able to be dereferenced to obtain an SBOL object.\\
Reference: \sec{sec:datatypes}}
\begin{scriptsize}
\setlength{\tabcolsep}{1pt}
\begin{longtable}{|llp{3.4in}l|}
\caption{Allowed object properties in the \uri{http://sbols.org/v3\#} namespace.\label{t:allowed_properties}}\\
\hline
Class & Parent & SBOL Properties & Reference \\
\hline
\endfirsthead
\multicolumn{4}{c}%
{\tablename\ \thetable\ -- \textit{Continued from previous page}} \\
\hline
Class & Parent & SBOL Properties & Reference \\
\hline
\endhead
\hline \multicolumn{4}{r}{\textit{Continued on next page}} \\
\endfoot
\hline
\endlastfoot
\hline
\sbol{Attachment} & \sbol{TopLevel} & \sbolmult{source:A}{source}, \sbol{format}, \sbol{size}, \sbol{hash}, \sbol{hashAlgorithm} & \sec{sec:Attachment} \\
\sbol{Collection} & \sbol{TopLevel} & \sbol{member} & \sec{sec:Collection} \\
\sbol{CombinatorialDerivation} & \sbol{TopLevel} & \sbol{template}, \sbol{strategy}, \sbol{hasVariableFeature} & \sec{sec:CombinatorialDerivation} \\
\sbol{ComponentReference} &\sbol{Feature} & \sbol{inChildOf}, \sbol{refersTo} & \sec{sec:ComponentReference} \\
\sbol{Component} & \sbol{TopLevel} & \sbolmult{type:C}{type}, \sbolmult{role:C}{role}, \sbolmult{hasSequence:C}{hasSequence}, \sbol{hasFeature}, \sbol{hasInteraction}, \sbol{hasConstraint}, \sbol{hasModel}, \sbol{hasInterface} & \sec{sec:Component} \\
\sbol{Constraint} & \sbol{Identified} & \sbol{subject}, \sbol{object}, \sbol{restriction} & \sec{sec:Constraint} \\
\sbol{Cut} & \sbol{Location} & \sbol{at} & \sec{sec:Cut} \\
\sbol{EntireSequence} & \sbol{Location} & & \sec{sec:EntireSequence} \\
\sbol{ExperimentalData} & \sbol{TopLevel} & & \sec{sec:ExperimentalData} \\
\sbol{Experiment} & \sbol{Collection} & & \sec{sec:Experiment} \\
\sbol{ExternallyDefined} & \sbol{Feature} & \sbolmult{type:ED}{type}, \sbolmult{definition:ED}{definition} & \sec{sec:ExternallyDefined} \\
\sbol{Feature} & \sbol{Identified} & \sbolmult{role:F}{role}, \sbolmult{orientation:F}{orientation} & \sec{sec:Feature} \\
\sbol{Identified} & none & \sbol{displayId}, \sbol{name}, \sbol{description}, \sbol{hasMeasure} & \sec{sec:Identified} \\
\sbol{Implementation} & \sbol{TopLevel} & \sbol{built} & \sec{sec:Implementation} \\
\sbol{Interaction} & \sbol{Identified} & \sbolmult{type:I}{type}, \sbol{hasParticipation} & \sec{sec:Interaction} \\
\sbol{Interface} & \sbol{Identified} & \sbol{input}, \sbol{output}, \sbol{nondirectional} & \sec{sec:Interface} \\
\sbol{LocalSubComponent} & \sbol{Feature} & \sbolmult{type:LSC}{type}, \sbolmult{hasLocation:LSC}{hasLocation} & \sec{sec:LocalSubComponent} \\
\sbol{Location} & \sbol{Identified} & \sbolmult{orientation:L}{orientation}, \sbol{order}, \sbolmult{hasSequence:L}{hasSequence} & \sec{sec:Location} \\
\sbol{Model} & \sbol{TopLevel} & \sbolmult{source:M}{source}, \sbol{language}, \sbol{framework} & \sec{sec:Model} \\
\sbol{Participation} & \sbol{Identified} & \sbolmult{role:P}{role}, \sbol{participant}, \sbol{higherOrderParticipant} & \sec{sec:Participation} \\
\sbol{Range} & \sbol{Location} & \sbol{start}, \sbol{end} & \sec{sec:Range} \\
\sbol{SequenceFeature} & \sbol{Feature} & \sbolmult{hasLocation:SF}{hasLocation} & \sec{sec:SequenceFeature} \\
\sbol{Sequence} & \sbol{TopLevel} & \sbol{elements}, \sbol{encoding} & \sec{sec:Sequence} \\
\sbol{SubComponent} & \sbol{Feature} & \sbol{roleIntegration}, \sbol{instanceOf}, \sbol{sourceLocation}, \sbolmult{hasLocation:SC}{hasLocation} & \sec{sec:SubComponent} \\
\sbol{TopLevel} & \sbol{Identified} & \sbol{hasNamespace}, \sbol{hasAttachment} & \sec{sec:TopLevel} \\
\sbol{VariableFeature} & \sbol{Identified} & \sbol{cardinality}, \sbol{variable}, \sbol{variant}, \sbol{variantCollection}, \sbol{variantDerivation}, \sbol{variantMeasure} & \sec{sec:VariableFeature} \\
\hline
\prov{Activity} & \sbol{TopLevel} & \sbolmult{type:Activity}{type} & \sec{sec:prov:Activity}\\
\prov{Agent} & \sbol{TopLevel} & & \sec{sec:prov:Agent}\\
\prov{Association} & \sbol{Identified} & & \sec{sec:prov:Association}\\
\prov{Plan} & \sbol{TopLevel} & & \sec{sec:prov:Plan}\\
\prov{Usage} & \sbol{Identified} & & \sec{sec:prov:Usage}\\
\hline
\om{BinaryPrefix} & \om{Prefix} & & \sec{sec:om:BinaryPrefix}\\
\om{CompoundUnit} & \om{Unit} & & \sec{sec:om:CompoundUnit}\\
\om{Measure} & \sbol{Identified} & \sbolmult{type:Measure}{type} & \sec{sec:om:Measure}\\
\om{PrefixedUnit} & \om{Unit} & & \sec{sec:om:PrefixedUnit}\\
\om{Prefix} & \sbol{TopLevel} & & \sec{sec:om:Prefix}\\
\om{SIPrefix} & \om{Prefix} & & \sec{sec:om:SIPrefix}\\
\om{SingularUnit} & \om{Unit} & & \sec{sec:om:SingularUnit}\\
\om{UnitDivision} & \om{CompoundUnit} & & \sec{sec:om:UnitDivision}\\
\om{UnitExponentiation} & \om{CompoundUnit} & & \sec{sec:om:UnitExponentiation}\\
\om{UnitMultiplication} & \om{CompoundUnit} & & \sec{sec:om:UnitMultiplication}\\
\om{Unit} & \sbol{TopLevel} & & \sec{sec:om:Unit}\\
\hline
\end{longtable}
\end{scriptsize}
\begin{scriptsize}
\setlength{\tabcolsep}{1pt}
\begin{longtable}{|llllll|}
\caption{Cardinality constraints on object properties, their types, and types of referred objects.\label{t:property_cardinality_type}}\\
\hline
Class & Property & Cardinality & Type & Referred Type & Reference\\
\hline
\endfirsthead
\multicolumn{6}{c}%
{\tablename\ \thetable\ -- \textit{Continued from previous page}} \\
\hline
Class & Property & Cardinality & Type & Referred Type & Reference\\
\hline
\endhead
\hline \multicolumn{6}{r}{\textit{Continued on next page}} \\
\endfoot
\hline
\endlastfoot
\sbol{Attachment} & \sbolmult{source:A}{source} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:Attachment}\\
\sbol{Attachment} & \sbol{format} & ZERO OR ONE & \sbol{IRI} & --- & \sec{sec:Attachment}\\
\sbol{Attachment} & \sbol{hashAlgorithm} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:Attachment}\\
\sbol{Attachment} & \sbol{hash} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:Attachment}\\
\sbol{Attachment} & \sbol{size} & ZERO OR ONE & \sbol{Long} & --- & \sec{sec:Attachment}\\
\sbol{Collection} & \sbol{member} & ZERO OR MORE & \sbol{IRI} & \sbol{TopLevel} & \sec{sec:Collection}\\
\sbol{CombinatorialDerivation} & \sbol{hasVariableFeature} & ZERO OR MORE & \sbol{IRI} & \sbol{VariableFeature} & \sec{sec:CombinatorialDerivation}\\
\sbol{CombinatorialDerivation} & \sbol{strategy} & ZERO OR ONE & \sbol{IRI} & --- & \sec{sec:CombinatorialDerivation}\\
\sbol{CombinatorialDerivation} & \sbol{template} & EXACTLY ONE & \sbol{IRI} & \sbol{Component} & \sec{sec:CombinatorialDerivation}\\
\sbol{ComponentReference} & \sbol{refersTo} & EXACTLY ONE & \sbol{IRI} & \sbol{Feature} & \sec{sec:ComponentReference}\\
\sbol{ComponentReference} & \sbol{inChildOf} & EXACTLY ONE & \sbol{IRI} & \sbol{SubComponent} & \sec{sec:ComponentReference}\\
\sbol{Component} & \sbolmult{hasSequence:C}{hasSequence} & ZERO OR MORE & \sbol{IRI} & \sbol{Sequence} & \sec{sec:Component}\\
\sbol{Component} & \sbolmult{role:C}{role} & ZERO OR MORE & \sbol{IRI} & --- & \sec{sec:Component}\\
\sbol{Component} & \sbolmult{type:C}{type} & ONE OR MORE & \sbol{IRI} & --- & \sec{sec:Component}\\
\sbol{Component} & \sbol{hasConstraint} & ZERO OR MORE & \sbol{IRI} & \sbol{Constraint} & \sec{sec:Component} \\
\sbol{Component} & \sbol{hasFeature} & ZERO OR MORE & \sbol{IRI} & \sbol{Feature} & \sec{sec:Component} \\
\sbol{Component} & \sbol{hasInteraction} & ZERO OR MORE & \sbol{IRI} & \sbol{Interaction} & \sec{sec:Component} \\
\sbol{Component} & \sbol{hasInterface} & ZERO OR MORE & \sbol{IRI} & \sbol{Interface} & \sec{sec:Component} \\
\sbol{Component} & \sbol{hasModel} & ZERO OR MORE & \sbol{IRI} & \sbol{Model} & \sec{sec:Component}\\
\sbol{Constraint} & \sbol{object} & EXACTLY ONE & \sbol{IRI} & \sbol{Feature} & \sec{sec:Constraint}\\
\sbol{Constraint} & \sbol{restriction} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:Constraint}\\
\sbol{Constraint} & \sbol{subject} & EXACTLY ONE & \sbol{IRI} & \sbol{Feature} & \sec{sec:Constraint}\\
\sbol{Cut} & \sbol{at} & EXACTLY ONE & \sbol{Integer} & --- & \sec{sec:Cut}\\
\sbol{Experiment} & \sbol{member} & ZERO OR MORE & \sbol{IRI} & \sbol{ExperimentalData} & \sec{sec:Collection}\\
\sbol{ExternallyDefined} & \sbolmult{definition:ED}{definition} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:ExternallyDefined}\\
\sbol{ExternallyDefined} & \sbolmult{type:ED}{type} &ONE OR MORE & \sbol{IRI} & --- & \sec{sec:ExternallyDefined}\\
\sbol{Feature} & \sbolmult{orientation:F}{orientation} & ZERO OR ONE & \sbol{IRI} & --- & \sec{sec:Feature}\\
\sbol{Feature} & \sbolmult{role:F}{role} & ZERO OR MORE & \sbol{IRI} & --- & \sec{sec:Feature}\\
\sbol{Identified} & \prov{wasDerivedFrom} & ZERO OR MORE & \sbol{IRI} & --- & \sec{sec:Identified}\\
\sbol{Identified} & \prov{wasGeneratedBy} & ZERO OR MORE & \sbol{IRI} & \prov{Activity} & \sec{sec:Identified}\\
\sbol{Identified} & \sbol{description} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:Identified}\\
\sbol{Identified} & \sbol{displayId} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:Identified}\\
\sbol{Identified} & \sbol{hasMeasure} & ZERO OR MORE & \sbol{IRI} & \om{Measure} & \sec{sec:Identified}\\
\sbol{Identified} & \sbol{name} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:Identified}\\
\sbol{Implementation} & \sbol{built} & ZERO OR ONE & \sbol{IRI} & \sbol{Component} & \sec{sec:Implementation}\\
\sbol{Interaction} & \sbolmult{type:I}{type} & ONE OR MORE & \sbol{IRI} & --- & \sec{sec:Interaction}\\
\sbol{Interaction} & \sbol{hasParticipation} & ZERO OR MORE & \sbol{IRI} & \sbol{Participation} & \sec{sec:Interaction}\\
\sbol{Interface} & \sbol{input} & ZERO OR MORE & \sbol{IRI} & \sbol{Feature} & \sec{sec:Interface}\\
\sbol{Interface} & \sbol{nondirectional} & ZERO OR MORE & \sbol{IRI} & \sbol{Feature} & \sec{sec:Interface}\\
\sbol{Interface} & \sbol{output} & ZERO OR MORE & \sbol{IRI} & \sbol{Feature} & \sec{sec:Interface}\\
\sbol{LocalSubComponent} & \sbolmult{hasLocation:LSC}{hasLocation} & ZERO OR MORE & \sbol{IRI} & \sbol{Location} & \sec{sec:LocalSubComponent}\\
\sbol{LocalSubComponent} & \sbolmult{type:LSC}{type} & ONE OR MORE & \sbol{IRI} & --- & \sec{sec:LocalSubComponent}\\
\sbol{Location} & \sbolmult{orientation:L}{orientation} & ZERO OR ONE & \sbol{IRI} & --- & \sec{sec:Location}\\
\sbol{Location} & \sbol{order} & ZERO OR ONE & \sbol{Integer} & --- & \sec{sec:Location}\\
\sbol{Location} & \sbolmult{hasSequence:L}{hasSequence} & EXACTLY ONE & \sbol{IRI} & \sbol{Sequence} & \sec{sec:Location}\\
\sbol{Model} & \sbolmult{source:M}{source} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:Model}\\
\sbol{Model} & \sbol{framework} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:Model}\\
\sbol{Model} & \sbol{language} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:Model}\\
\sbol{Participation} & \sbol{participant} & ZERO OR ONE & \sbol{IRI} & \sbol{Feature} & \sec{sec:Participation}\\
\sbol{Participation} & \sbol{higherOrderParticipant} & ZERO OR ONE & \sbol{IRI} & \sbol{Interaction} & \sec{sec:Participation}\\
\sbol{Participation} & \sbolmult{role:P}{role} & ONE OR MORE & \sbol{IRI} & --- & \sec{sec:Participation}\\
\sbol{Range} & \sbol{end} & EXACTLY ONE & \sbol{Integer} & --- & \sec{sec:Range}\\
\sbol{Range} & \sbol{start} & EXACTLY ONE & \sbol{Integer} & --- & \sec{sec:Range}\\
\sbol{SequenceFeature} & \sbolmult{hasLocation:SF}{hasLocation} & ONE OR MORE & \sbol{IRI} & \sbol{Location} & \sec{sec:SequenceFeature}\\
\sbol{Sequence} & \sbol{elements} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:Sequence}\\
\sbol{Sequence} & \sbol{encoding} & ZERO OR ONE & \sbol{IRI} & --- & \sec{sec:Sequence}\\
\sbol{SubComponent} & \sbol{instanceOf} & EXACTLY ONE & \sbol{IRI} & \sbol{Component} & \sec{sec:SubComponent}\\
\sbol{SubComponent} & \sbol{roleIntegration} & ZERO OR ONE & \sbol{IRI} & --- & \sec{sec:SubComponent}\\
\sbol{SubComponent} & \sbol{sourceLocation} & ZERO OR MORE & \sbol{IRI} & \sbol{Location} & \sec{sec:SubComponent}\\
\sbol{SubComponent} & \sbolmult{hasLocation:SC}{hasLocation} & ZERO OR MORE & \sbol{IRI} & \sbol{Location} & \sec{sec:SubComponent}\\
\sbol{TopLevel} & \sbol{hasAttachment} & ZERO OR MORE & \sbol{IRI} & \sbol{Attachment} & \sec{sec:TopLevel}\\
\sbol{TopLevel} & \sbol{hasNamespace} & EXACTLY ONE & \sbol{URL} & --- & \sec{sec:TopLevel}\\
\sbol{VariableFeature} & \sbol{cardinality} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:VariableFeature}\\
\sbol{VariableFeature} & \sbol{variable} & EXACTLY ONE & \sbol{IRI} & \sbol{Feature} & \sec{sec:VariableFeature}\\
\sbol{VariableFeature} & \sbol{variantCollection} & ZERO OR MORE & \sbol{IRI} & \sbol{Collection} & \sec{sec:VariableFeature}\\
\sbol{VariableFeature} & \sbol{variantDerivation} & ZERO OR MORE & \sbol{IRI} & \sbol{CombinatorialDerivation} & \sec{sec:VariableFeature}\\
\sbol{VariableFeature} & \sbol{variantMeasure} & ZERO OR MORE & \sbol{IRI} & \om{Measure} & \sec{sec:VariableFeature}\\
\sbol{VariableFeature} & \sbol{variant} & ZERO OR MORE & \sbol{IRI} & \sbol{Component} & \sec{sec:VariableFeature}\\
\hline
\prov{Activity} & \prov{endedAtTime} & ZERO OR ONE & \sbol{DateTime} & --- & \sec{sec:prov:Activity}\\
\prov{Activity} & \prov{qualifiedUsage} & ZERO OR MORE & \sbol{IRI} & \prov{Usage} & \sec{sec:prov:Activity}\\
\prov{Activity} & \prov{startedAtTime} & ZERO OR ONE & \sbol{DateTime} & --- & \sec{sec:prov:Activity}\\
\prov{Activity} & \prov{wasInformedBy} & ZERO OR MORE & \sbol{IRI} & \prov{Activity} & \sec{sec:prov:Activity}\\
\prov{Activity} & \sbolmult{type:Activity}{type} & ZERO OR MORE & \sbol{IRI} & --- & \sec{sec:prov:Activity}\\
\prov{Activity} & \prov{qualifiedAssociation} & ZERO OR MORE & \sbol{IRI} & \prov{Association} & \sec{sec:prov:Activity}\\
\prov{Association} & \prov{agent} & EXACTLY ONE & \sbol{IRI} & \prov{Agent} & \sec{sec:prov:Association}\\
\prov{Association} & \provmult{hadRole:A}{hadRole} & ZERO OR MORE & \sbol{IRI} & --- & \sec{sec:prov:Association}\\
\prov{Association} & \prov{hadPlan} & ZERO OR ONE & \sbol{IRI} & \prov{Plan} & \sec{sec:prov:Association}\\
\prov{Usage} & \prov{entity} & EXACTLY ONE & \sbol{IRI} & --- & \sec{sec:prov:Usage}\\
\prov{Usage} & \provmult{hadRole:U}{hadRole} & ZERO OR MORE & \sbol{IRI} & --- & \sec{sec:prov:Usage}\\
\hline
\om{Measure} & \sbolmult{type:Measure}{type} & ZERO OR MORE & \sbol{IRI} & --- & \sec{sec:om:Measure}\\
\om{Measure} & \ommult{hasUnit:Measure}{hasUnit} & EXACTLY ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:Measure}\\
\om{Measure} & \om{hasNumericalValue} & EXACTLY ONE & xsd:float & --- & \sec{sec:om:Measure}\\
\om{PrefixedUnit} & \ommult{hasUnit:PrefixedUnit}{hasUnit} & EXACTLY ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:PrefixedUnit}\\
\om{PrefixedUnit} & \om{hasPrefix} & EXACTLY ONE & \sbol{IRI} & \om{Prefix} & \sec{sec:om:PrefixedUnit}\\
\om{Prefix} & \ommult{alternativeLabels:Prefix}{alternativeLabels} & ZERO OR MORE & \sbol{String} & --- & \sec{sec:om:Prefix}\\
\om{Prefix} & \ommult{comment:Prefix}{comment} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:om:Prefix}\\
\om{Prefix} & \ommult{hasFactor:Prefix}{hasFactor} & EXACTLY ONE & xsd:float & --- & \sec{sec:om:Prefix}\\
\om{Prefix} & \ommult{label:Prefix}{label} & EXACTLY ONE & \sbol{String} & --- & \sec{sec:om:Prefix}\\
\om{Prefix} & \ommult{longcomment:Prefix}{longcomment} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:om:Prefix}\\
\om{Prefix} & \ommult{alternativeSymbols:Prefix}{alternativeSymbol} & ZERO OR MORE & \sbol{String} & --- & \sec{sec:om:Prefix}\\
\om{Prefix} & \ommult{symbol:Prefix}{symbol} & EXACTLY ONE & \sbol{String} & --- & \sec{sec:om:Prefix}\\
\om{SingularUnit} & \ommult{hasUnit:SingularUnit}{hasUnit} & ZERO OR ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:SingularUnit}\\
\om{SingularUnit} & \ommult{hasFactor:SingularUnit}{hasFactor} & ZERO OR ONE & xsd:float & --- & \sec{sec:om:SingularUnit}\\
\om{UnitDivision} & \om{hasDenominator} & EXACTLY ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:UnitDivision}\\
\om{UnitDivision} & \om{hasNumerator} & EXACTLY ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:UnitDivision}\\
\om{UnitExponentiation} & \om{hasBase} & EXACTLY ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:UnitExponentiation}\\
\om{UnitExponentiation} & \om{hasExponent} & EXACTLY ONE & xsd:integer & --- & \sec{sec:om:UnitExponentiation}\\
\om{UnitMultiplication} & \om{hasTerm1} & EXACTLY ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:UnitMultiplication}\\
\om{UnitMultiplication} & \om{hasTerm2} & EXACTLY ONE & \sbol{IRI} & \om{Unit} & \sec{sec:om:UnitMultiplication}\\
\om{Unit} & \ommult{alternativeLabels:Unit}{alternativeLabels} & ZERO OR MORE & \sbol{String} & --- & \sec{sec:om:Unit}\\
\om{Unit} & \ommult{label:Unit}{label} & EXACTLY ONE & \sbol{String} & --- & \sec{sec:om:Unit}\\
\om{Unit} & \ommult{longcomment:Unit}{longcomment} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:om:Unit}\\
\om{Unit} & \ommult{symbol:Unit}{symbol} & EXACTLY ONE & \sbol{String} & --- & \sec{sec:om:Unit}\\
\om{Unit} & \ommult{alternativeSymbols:Unit}{alternativeSymbols} & ZERO OR MORE & \sbol{String} & --- & \sec{sec:om:Unit}\\
\om{Unit} & \ommult{comment:Unit}{comment} & ZERO OR ONE & \sbol{String} & --- & \sec{sec:om:Unit}\\
\hline
\end{longtable}
\end{scriptsize}
\subsubsection*{Rules for the \class{Identified} class}
\setcounter{sbolCtr}{10201}
\printValid{The \sbol{displayId} property, if specified, MUST be composed of only alphanumeric or underscore characters and MUST NOT begin with a digit.\\ Reference: \sec{sec:Identified}}
\printValid{An \sbol{Identified} object MUST NOT refer to itself via its own \prov{wasDerivedFrom} property.\\ Reference: \sec{sec:Identified}}
\printComplete{An \sbol{Identified} object MUST NOT form a cyclical chain of references via its \prov{wasDerivedFrom} property and those of other \sbol{Identified} objects. \\ Reference: \sec{sec:Identified}}
\printComplete{Provenance history formed by \prov{wasGeneratedBy} properties of \sbol{Identified} objects and\\
\prov{entity} references in \prov{Usage} objects MUST NOT form circular reference chains.
\\ Reference: \sec{sec:Identified}}
\printModeling{An \sbol{Identified} object with a \prov{wasGeneratedBy} property referring to an \prov{Activity} with a child \prov{Association} that has a \provmult{hadRole:A}{hadRole} property with a value from \ref{tbl:activity_types} should be of the corresponding type in \ref{tbl:dbtl_stages}.\\ Reference: \sec{sec:provenance}}
\subsubsection*{Rules for the \class{TopLevel} class}
\setcounter{sbolCtr}{10301}
\printValid{If the IRI for the \sbol{TopLevel} object is a URL, then the URL of the \sbol{hasNamespace} property MUST prefix match that URL. \\ Reference: \sec{sec:TopLevel}}
\subsubsection*{Rules for the \class{Sequence} class}
\setcounter{sbolCtr}{10501}
\printValid{If the \sbol{elements} property is set, then the \sbol{encoding} property of \sbol{Sequence} MUST be provided.\\ Reference: \sec{sec:Sequence}}
\printWarning{The \sbol{encoding} property of a \sbol{Sequence} MUST indicate how the \sbol{elements} property of the \sbol{Sequence} is to be formed and interpreted.\\ Reference: \sec{sec:Sequence}}
\printComplete{The \sbol{elements} property of a \sbol{Sequence} MUST be consistent with its \sbol{encoding} property.\\ Reference: \sec{sec:Sequence}}
\printWarning{The \sbol{encoding} property of a \sbol{Sequence} MUST contain a \sbol{URL} from \ref{tbl:sequence_encodings} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:Sequence}}
\printModeling{The \sbol{encoding} property of a \sbol{Sequence} SHOULD contain a \sbol{URL} from the textual format (\url{https://identifiers.org/edam:format_2330}) branch of the EDAM ontology\\ Reference: \sec{sec:Sequence}}
\subsubsection*{Rules for the \class{Component} class}
\setcounter{sbolCtr}{10601}
\printValid{The set of \sbolmult{type:C}{type} properties of a \sbol{Component} MUST NOT have more than one \sbol{URL} from \ref{tbl:component_types}.\\ Reference: \sec{sec:Component}}
\printWarning{Each \sbolmult{type:C}{type} property of a \sbol{Component} MUST refer to an ontology term that describes the category of biochemical or physical entity that is represented by the \sbol{Component}.\\ Reference: \sec{sec:Component}}
\printWarning{A \sbol{Component} MUST have a \sbolmult{type:C}{type} property from \ref{tbl:component_types} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:Component}}
\printModeling{A \sbol{Component} SHOULD have a \sbolmult{type:C}{type} property that uses the physical entity representation branch of the Systems Biology Ontology.\\ Reference: \sec{sec:Component}}
\printWarning{All \sbolmult{type:C}{type} properties of a \sbol{Component} MUST refer to non-conflicting ontology terms.\\ Reference: \sec{sec:Component}}
\printWarning{If the \sbolmult{type:C}{type} property of a \sbol{Component} contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}, then its \sbolmult{type:C}{type} property MUST contain a \sbol{URL} that refers to a term from the topology attribute branch of the SO, if the topology is known.\\ Reference: \sec{sec:Component}}
\printModeling{If the \sbolmult{type:C}{type} property of a \sbol{Component} contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}, then its \sbolmult{type:C}{type} property SHOULD also contain at most one \sbol{URL} that refers to a term from the topology attribute branch of the SO.\\
Reference: \sec{sec:Component}}
\printModeling{A \sbol{Component} SHOULD NOT have a \sbolmult{type:C}{type} property that refers to a term from the topology attribute or strand attribute branches of the SO unless it also has a \sbolmult{type:C}{type} property with the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}.
Reference: \sec{sec:Component}}
\printWarning{Each \sbolmult{role:C}{role} property of a \sbol{Component} MUST refer to an ontology term that is consistent with its \sbolmult{type:C}{type} property.\\ Reference: \sec{sec:Component}}
\printWarning{Each \sbolmult{role:C}{role} property of a \sbol{Component} MUST refer to an ontology term that clarifies the potential function of the \sbol{Component} in a biochemical or physical context.\\ Reference: \sec{sec:Component}}
\printWarning{A \sbolmult{role:C}{role} property of a \sbol{Component} MUST contain a \sbol{URL} from \ref{tbl:component_roles} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:Component}}
\printModeling{
A \sbolmult{role:C}{role} property of a \sbol{Component} SHOULD NOT contain a \sbol{URL} that refers to a term from the sequence feature branch of the SO unless its \sbolmult{type:C}{type} property contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}.
\\ Reference: \sec{sec:Component}}
\printModeling{If a \sbolmult{type:C}{type} property of a \sbol{Component} contains the DNA or RNA type \sbol{URL}, then its \sbolmult{type:C}{role} property SHOULD contain exactly one \sbol{URL} that refers to a term from the sequence feature branch of the SO.\\
Reference: \sec{sec:Component}}
\printWarning{The \sbol{Sequence} objects referred to by the \sbolmult{hasSequence:C}{hasSequence} properties of a \sbol{Component} MUST be consistent with each other, such that well-defined mappings exist between their \sbol{elements} properties in accordance with their \sbol{encoding} properties.\\ Reference: \sec{sec:Component}}
\printWarning{A \sbolmult{hasSequence:C}{hasSequence} property of a \sbol{Component} MUST NOT refer to \sbol{Sequence} objects with conflicting \sbol{encoding} properties.\\ Reference: \sec{sec:Component}}
\printComplete{If a \sbolmult{hasSequence:C}{hasSequence} property of a \sbol{Component} refers to a \sbol{Sequence} object, and one of the \sbolmult{type:C}{type} properties of this \sbol{Component} comes from \ref{tbl:component_types}, then one of the \sbol{Sequence} objects MUST have the \sbol{encoding} that is cross-listed with this type in \ref{tbl:sequence_encodings}.\\
Reference: \sec{sec:Component}}
\printModeling{If a \sbol{Component} has more than one \sbolmult{hasSequence:C}{hasSequence} property that refer to \sbol{Sequence} objects with the same \sbol{encoding}, then the \sbol{elements} of these \sbol{Sequence} objects SHOULD have equal lengths.\\ Reference: \sec{sec:Component}}
% QUESTION: do we still need this one:
% Answer: I believe that it is unworkably complex, as the "restrictions on the positions" bit may end up requiring solving an NP-complete problem to check.
%\printModeling{If a \sbol{Component} in a \sbol{Component}-\sbol{Component} hierarchy refers to one or more \sbol{Sequence} objects, and there exist \sbol{Component} objects lower in the hierarchy that refer to \sbol{Sequence} objects with the same \sbol{encoding}, then the \sbol{elements} properties of these \sbol{Sequence} objects SHOULD be consistent with each other, such that well-defined mappings exist from the ``lower level'' \sbol{elements} to the ``higher level'' \sbol{elements} in accordance with their shared \sbol{encoding} properties. This mapping is also subject to any restrictions on the positions of the \sbol{Component} objects in the hierarchy that are imposed by the \sbol{SequenceFeature} or \sbol{SequenceConstraint} objects contained by the \sbol{Component} objects in the hierarchy.\\ Reference: \sec{sec:Component}}
\subsubsection*{Rules for the \class{Feature} class}
\setcounter{sbolCtr}{10701}
\printWarning{Each \sbolmult{role:F}{role} property of a \sbol{Feature} MUST refer to a resource that clarifies the intended function of the \sbol{Feature}.\\
Reference: \sec{sec:Feature}}
\printValid{If a \sbol{Feature} has an \sbolmult{orientation:F}{orientation} property, its \sbol{URL} MUST be drawn from \ref{tbl:orientation_types} or \ref{tbl:orientation_types_alternative}.\\ Reference: \sec{sec:Feature}}
%\todo[inline]{Should we add that orientation SHOULD be used precisely for features of type DNA in components of type DNA?}
\subsubsection*{Rules for the \class{SubComponent} class}
\setcounter{sbolCtr}{10801}
\printValid{If a \sbol{SubComponent} has an \sbol{roleIntegration} property, its \sbol{URL} MUST be drawn from \ref{tbl:component_roleIntegration}.
\\ Reference: \sec{sec:SubComponent}}
\printValid{The \sbol{roleIntegration} property of a \sbol{SubComponent} is REQUIRED if the \sbol{SubComponent} has one or more \sbolmult{role:F}{role} properties.
\\ Reference: \sec{sec:SubComponent}}
\printValid{The \sbol{instanceOf} property of a \sbol{SubComponent} MUST NOT refer to the same \sbol{Component} as the one that contains the \sbol{SubComponent}.\\ Reference: \sec{sec:SubComponent}}
\printComplete{\sbol{SubComponent} objects MUST NOT form circular reference chains via their \sbol{instanceOf} properties and the \sbol{Component} objects that contain them.\\ Reference: \sec{sec:SubComponent}}
\printValid{The set of \sbol{Location} objects referred to by the \sbolmult{hasLocation:SC}{hasLocation} properties of a single \sbol{SubComponent} MUST NOT specify overlapping regions.\\ Reference: \sec{sec:SubComponent}}
\printValid{If a \sbol{SubComponent} object has at least one \sbolmult{hasLocation:SC}{hasLocation} and \sbol{sourceLocation} properties, then the sum of the lengths of the \sbol{Location} objects referred to by the \sbolmult{hasLocation:SC}{hasLocation} properties MUST equal the sum of the lengths of the \sbol{Location} objects referred to by the \sbol{sourceLocation} properties.\\
Reference: \sec{sec:SubComponent}}
\printComplete{If a \sbol{SubComponent} object has at least one \sbolmult{hasLocation:SC}{hasLocation} and zero \sbol{sourceLocation} properties, and the \sbol{Component} linked by its \sbol{instanceOf} has precisely one \sbolmult{hasSequence:C}{hasSequence} property whose \sbol{Sequence} has a value for its \sbol{elements} property, then the sum of the lengths of the \sbol{Location} objects referred to by the \sbolmult{hasLocation:SC}{hasLocation} properties MUST equal the length of the \sbol{elements} value of the \sbol{Sequence}.\\
Reference: \sec{sec:SubComponent}}
% Note: it is intentional that sourceLocation properties MAY have overlapping regions.
\subsubsection*{Rules for the \class{ComponentReference} class}
\setcounter{sbolCtr}{10901}
\printValid{If a \sbol{ComponentReference} object is a child of a \sbol{Component}, then its \sbol{inChildOf} property MUST be a \sbol{SubComponent} of its parent.
\\ Reference: \sec{sec:ComponentReference}}
\printValid{If a \sbol{ComponentReference} object is a child of another \sbol{ComponentReference}, via the \sbol{refersTo} property, then its \sbol{inChildOf} property MUST be a \sbol{SubComponent} of the \sbol{Component} referred to by the \sbol{instanceOf} property of the \sbol{SubComponent} referred to by the parent's \sbol{inChildOf} property.
\\ Reference: \sec{sec:ComponentReference}}
\printValid{If the \sbol{refersTo} property of a \sbol{ComponentReference} refers to another \sbol{ComponentReference}, then the second \sbol{ComponentReference} MUST be either a child of the first \sbol{ComponentReference} or a child of the \sbol{Component} referred to by the \sbol{instanceOf} property of the \sbol{SubComponent} referred to by the \sbol{inChildOf} property of the first \sbol{ComponentReference}.
\\ Reference: \sec{sec:ComponentReference}}
\printValid{If the \sbol{refersTo} property of a \sbol{ComponentReference} refers to a \sbol{Feature} of any other type besides \sbol{ComponentReference}, then that \sbol{Feature} MUST be a child of the \sbol{Component} referred to by the \sbol{instanceOf} property of the \sbol{SubComponent} referred to by the \sbol{inChildOf} property of the first \sbol{ComponentReference}.
\\ Reference: \sec{sec:ComponentReference}}
\subsubsection*{Rules for the \class{LocalSubComponent} class}
\setcounter{sbolCtr}{11001}
\printValid{A \sbol{LocalSubComponent} MUST NOT have more than one \sbol{URL} from \ref{tbl:component_types}.\\ Reference: \sec{sec:LocalSubComponent}}
\printWarning{Each \sbolmult{type:LSC}{type} property of a \sbol{LocalSubComponent} MUST refer to an ontology term that describes the category of biochemical or physical entity that is represented by the \sbol{LocalSubComponent}.\\ Reference: \sec{sec:LocalSubComponent}}
\printWarning{A \sbol{LocalSubComponent} MUST have a \sbolmult{type:LSC}{type} property from \ref{tbl:component_types} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:LocalSubComponent}}
\printModeling{A \sbol{LocalSubComponent} SHOULD have a \sbolmult{type:LSC}{type} property from \ref{tbl:component_types}.\\ Reference: \sec{sec:LocalSubComponent}}
\printWarning{All \sbolmult{type:LSC}{type} properties of a \sbol{LocalSubComponent} MUST refer to non-conflicting ontology terms.\\ Reference: \sec{sec:LocalSubComponent}}
\printWarning{If the \sbolmult{type:LSC}{type} property of a \sbol{LocalSubComponent} contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}, then its \sbolmult{type:LSC}{type} property MUST contain a \sbol{URL} that refers to a term from the topology attribute branch of the SO, if the topology is known.\\ Reference: \sec{sec:LocalSubComponent}}
\printModeling{If the \sbolmult{type:LSC}{type} property of a \sbol{LocalSubComponent} contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}, then its \sbolmult{type:LSC}{type} property SHOULD also contain at most one \sbol{URL} that refers to a term from the topology attribute branch of the SO.\\
Reference: \sec{sec:LocalSubComponent}}
\printModeling{A \sbol{LocalSubComponent} SHOULD NOT have a \sbolmult{type:LSC}{type} property that refers to a term from the topology attribute or strand attribute branches of the SO unless it also has a \sbolmult{type:LSC}{type} property with the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}.
Reference: \sec{sec:LocalSubComponent}}
\printWarning{Each \sbolmult{role:F}{role} property of a \sbol{LocalSubComponent} MUST refer to an ontology term that is consistent with its \sbolmult{type:LSC}{type} property.\\ Reference: \sec{sec:Component}}
\printWarning{A \sbolmult{role:F}{role} property of a \sbol{LocalSubComponent} MUST contain a \sbol{URL} from \ref{tbl:component_roles} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:Component}}
\printModeling{
A \sbolmult{role:F}{role} property of a \sbol{LocalSubComponent} SHOULD NOT contain a \sbol{URL} that refers to a term from the sequence feature branch of the SO unless its \sbolmult{type:LSC}{type} property contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}.
\\ Reference: \sec{sec:Component}}
\printModeling{If a \sbolmult{type:LSC}{type} property of a \sbol{LocalSubComponent} contains the DNA or RNA type \sbol{URL}, then its \sbolmult{role:F}{role} property SHOULD contain exactly one \sbol{URL} that refers to a term from the sequence feature branch of the SO.\\
Reference: \sec{sec:Component}}
\printValid{The set of \sbol{Location} objects referred to by the \sbolmult{hasLocation:LSC}{hasLocation} properties of a single \sbol{LocalSubComponent} MUST NOT specify overlapping regions.\\ Reference: \sec{sec:LocalSubComponent}}
\subsubsection*{Rules for the \class{ExternallyDefined} class}
\setcounter{sbolCtr}{11101}
\printValid{A \sbol{ExternallyDefined} MUST NOT have more than one \sbol{URL} from \ref{tbl:component_types}.\\ Reference: \sec{sec:ExternallyDefined}}
\printWarning{Each \sbolmult{type:ED}{type} property of a \sbol{ExternallyDefined} MUST refer to an ontology term that describes the category of biochemical or physical entity that is represented by the \sbol{Component}.\\ Reference: \sec{sec:ExternallyDefined}}
\printWarning{A \sbol{ExternallyDefined} MUST have a \sbolmult{type:ED}{type} property from \ref{tbl:component_types} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:ExternallyDefined}}
\printModeling{A \sbol{ExternallyDefined} SHOULD have a \sbolmult{type:ED}{type} property from \ref{tbl:component_types}.\\ Reference: \sec{sec:ExternallyDefined}}
\printWarning{All \sbolmult{type:ED}{type} properties of a \sbol{ExternallyDefined} MUST refer to non-conflicting ontology terms.\\ Reference: \sec{sec:ExternallyDefined}}
\printWarning{If the \sbolmult{type:ED}{type} property of a \sbol{ExternallyDefined} contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}, then its \sbolmult{type:ED}{type} property MUST contain a \sbol{URL} that refers to a term from the topology attribute branch of the SO, if the topology is known.\\ Reference: \sec{sec:ExternallyDefined}}
\printModeling{If the \sbolmult{type:ED}{type} property of a \sbol{ExternallyDefined} contains the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}, then its \sbolmult{type:ED}{type} property SHOULD also contain at most one \sbol{URL} that refers to a term from the topology attribute branch of the SO.\\
Reference: \sec{sec:ExternallyDefined}}
\printModeling{A \sbol{ExternallyDefined} SHOULD NOT have a \sbolmult{type:ED}{type} property that refers to a term from the topology attribute or strand attribute branches of the SO unless it also has a \sbolmult{type:ED}{type} property with the DNA or RNA type \sbol{URL} listed in \ref{tbl:component_types}.
Reference: \sec{sec:ExternallyDefined}}
\printWarning{The \sbol{URL} contained by the \sbolmult{definition:ED}{definition} property of a \sbol{ExternallyDefined} SHOULD refer to an external resource in Section~\ref{sec:recomm_ontologies} when the object is defined in one of these resources.\\ Reference: \sec{sec:ExternallyDefined}}
\subsubsection*{Rules for the \class{SequenceFeature} class}
\setcounter{sbolCtr}{11201}
\printValid{The set of \sbol{Location} objects referred to by the \sbolmult{hasLocation:SF}{hasLocation} properties of a single \sbol{SequenceFeature} MUST NOT specify overlapping regions.\\ Reference: \sec{sec:SequenceFeature}}
\subsubsection*{Rules for the \class{Location} class}
\setcounter{sbolCtr}{11301}
\printValid{If a \sbol{Location} has an \sbolmult{orientation:L}{orientation} property, its \sbol{URL} MUST be drawn from \ref{tbl:orientation_types} or \ref{tbl:orientation_types_alternative}.\\ Reference: \sec{sec:Location}}
\printValid{For every \sbol{Location} that is not an \sbol{EntireSequence} and that is the value of a \sbolmult{hasLocation:SC}{hasLocation} property of a \sbol{Feature}, the value of its \sbolmult{hasSequence:L}{hasSequence} property MUST also either be a value of the \sbolmult{hasSequence:L}{hasSequence} property of the parent \sbol{Component} or else be the value of some \sbolmult{hasSequence:L}{hasSequence} property of an \sbol{EntireSequence} that is also a child of the same \sbol{Component}.\\ Reference: \sec{sec:Location}}
\printComplete{For every \sbol{Location} that is not an \sbol{EntireSequence} and that is the value of a \sbol{sourceLocation} property of a \sbol{SubComponent}, the value of its \sbolmult{hasSequence:L}{hasSequence} property MUST also either be a value of the \sbolmult{hasSequence:L}{hasSequence} property of the \sbol{Component} linked by its parent's \sbol{instanceOf} property or else be the value of some \sbolmult{hasSequence:L}{hasSequence} property of an \sbol{EntireSequence} that is also a child of the same \sbol{Component} linked by \sbol{instanceOf}.\\ Reference: \sec{sec:Location}}
\subsubsection*{Rules for the \class{Range} class}
\setcounter{sbolCtr}{11401}
\printValid{The value of the \sbol{start} property of a \sbol{Range} MUST be greater than zero and less than or equal to the length of the \sbol{elements} value of the \sbol{Sequence} referred to by its \sbolmult{hasSequence:L}{hasSequence} property.\\ Reference: \sec{sec:Range}}
\printValid{The value of the \sbol{end} property of a \sbol{Range} MUST be greater than zero and less than or equal to the length of the \sbol{elements} value of the\sbol{Sequence} referred to by its \sbolmult{hasSequence:L}{hasSequence} property.\\ Reference: \sec{sec:Range}}
\printValid{The value of the \sbol{end} property of a \sbol{Range} MUST be greater than or equal to the value of its \sbol{start} property.\\ Reference: \sec{sec:Range}}
\subsubsection*{Rules for the \class{Cut} class}
\setcounter{sbolCtr}{11501}
\printValid{The value of the \sbol{at} property of a \sbol{Cut} MUST be greater than or equal to zero and less than or equal to the length of the \sbol{elements} value of the \sbol{Sequence} referred to by its \sbolmult{hasSequence:L}{hasSequence} property.\\ Reference: \sec{sec:Cut}}
%\subsubsection*{Rules for the \class{EntireSequence} class}
%\setcounter{sbolCtr}{11601}
\subsubsection*{Rules for the \class{Constraint} class}
\setcounter{sbolCtr}{11701}
\printValid{The \sbol{Feature} referenced by the \sbol{subject} property of a \sbol{Constraint} MUST be contained by the \sbol{Component} that contains the \sbol{Constraint}.\\ Reference: \sec{sec:Constraint}}
\printValid{The \sbol{Feature} referenced by the \sbol{object} property of a \sbol{Constraint} MUST be contained by the \sbol{Component} that contains the \sbol{Constraint}.\\ Reference: \sec{sec:Constraint}}
\printValid{The \sbol{object} property of a \sbol{Constraint} MUST NOT refer to the same \sbol{SubComponent} as the \sbol{subject} property of the \sbol{Constraint}.\\ Reference: \sec{sec:Constraint}}
\printModeling{The value of the \sbol{restriction} property of a \sbol{Constraint} SHOULD be drawn from \ref{tbl:restriction_types_identity}, \ref{tbl:restriction_types_topology}, or \ref{tbl:restriction_types_sequence}.
\\ Reference: \sec{sec:Constraint}}
\printComplete{If the \sbol{restriction} property of a \sbol{Constraint} is drawn from \ref{tbl:restriction_types_identity}, then the \sbol{Feature} objects referred to by the \sbol{subject} and \sbol{object} properties MUST comply with the relation specified in \ref{tbl:restriction_types_identity}.}
\printComplete{If the \sbol{restriction} property of a \sbol{Constraint} is drawn from \ref{tbl:restriction_types_sequence} and if the \sbol{Feature} objects referred to by the \sbol{subject} and \sbol{object} properties both have \sbolmult{hasLocation:SC}{hasLocation} properties with \sbol{Location} objects whose \sbolmult{hasSequence:L}{hasSequence} property refers to the same \sbol{Sequence}, then the positions of the referred \sbol{Location} objects MUST comply with the relation specified in \ref{tbl:restriction_types_sequence}.}
\subsubsection*{Rules for the \class{Interaction} class}
\setcounter{sbolCtr}{11801}
\printWarning{Each \sbolmult{type:I}{type} property of an \sbol{Interaction} MUST refer to an ontology term that describes the behavior represented by the \sbol{Interaction}.\\ Reference: \sec{sec:Interaction}}
\printWarning{All \sbolmult{type:I}{type} properties of an \sbol{Interaction} MUST refer to non-conflicting ontology terms.\\ Reference: \sec{sec:Interaction}}
\printModeling{Exactly one \sbolmult{type:I}{type} property of an \sbol{Interaction} SHOULD refer to a term from the occurring entity relationship branch of the SBO.\\ Reference: \sec{sec:Interaction}}
\printModeling{If the \sbol{hasParticipation} properties of an \sbol{Interaction} refer to one or more \sbol{Participation} objects, and one of the \sbolmult{type:I}{type} properties of this \sbol{Interaction} comes from \ref{tbl:interaction_types}, then the \sbol{Participation} objects SHOULD have a \sbolmult{role:P}{role} from the set of \sbolmult{role:P}{role} properties that is cross-listed with this type in \ref{tbl:participant_roles}.\\
Reference: \sec{sec:Interaction}}
\subsubsection*{Rules for the \class{Participation} class}
\setcounter{sbolCtr}{11901}
\printValid{A \sbol{Participation} MUST contain precisely one \sbol{participant} or \sbol{higherOrderParticipant} property.\\ Reference: \sec{sec:Participation}}
\printValid{The \sbol{Feature} referenced by the \sbol{participant} property of a \sbol{Participation} MUST be contained by the \sbol{Component} that contains the \sbol{Interaction} that contains the \sbol{Participation}.\\ Reference: \sec{sec:Participation}}
\printValid{The \sbol{Interaction} referenced by the \sbol{higherOrderParticipant} property of a \sbol{Participation} MUST be contained by the \sbol{Component} that contains the \sbol{Interaction} that contains the \sbol{Participation}.\\ Reference: \sec{sec:Participation}}
\printWarning{Each \sbolmult{role:P}{role} property of a \sbol{Participation} MUST refer to an ontology term that describes the behavior represented by the \sbol{Participation}.\\ Reference: \sec{sec:Participation}}
\printWarning{All \sbolmult{role:P}{role} properties of a \sbol{Participation} MUST refer to non-conflicting ontology terms.\\ Reference: \sec{sec:Participation}}
\printModeling{Exactly one role in the set of \sbolmult{role:P}{role} properties SHOULD be a \sbol{URL} from the participant role branch of the SBO (see \ref{tbl:participant_roles}).\\ Reference: \sec{sec:Participation}}
\subsubsection*{Rules for the \class{Interface} class}
\setcounter{sbolCtr}{12001}
\printValid{The \sbol{Feature} referenced by the \sbol{input} property of an \sbol{Interface} MUST be contained by the \sbol{Component} that contains the \sbol{Interface}.\\ Reference: \sec{sec:Interface}}
\printValid{The \sbol{Feature} referenced by the \sbol{output} property of an \sbol{Interface} MUST be contained by the \sbol{Component} that contains the \sbol{Interface}.\\ Reference: \sec{sec:Interface}}
\printValid{The \sbol{Feature} referenced by the \sbol{nondirectional} property of an \sbol{Interface} MUST be contained by the \sbol{Component} that contains the \sbol{Interface}.\\ Reference: \sec{sec:Interface}}
\subsubsection*{Rules for the \class{CombinatorialDerivation} class}
\setcounter{sbolCtr}{12101}
\printValid{The \sbol{strategy} property of a \sbol{CombinatorialDerivation}, if specified, MUST contain a \sbol{URL} from \ref{tbl:strategy}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
\printValid{If the \sbol{strategy} property of a \sbol{CombinatorialDerivation} contains the \sbol{URL}~\url{http://sbols.org/v3\#enumerate}, then its \sbol{hasVariableFeature} property MUST NOT contain a\\ \sbol{VariableFeature} with an \sbol{cardinality} property that contains the \sbol{URL}~\url{http://sbols.org/v3\#zeroOrMore} or the \sbol{URL}~\url{http://sbols.org/v3\#oneOrMore}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
\printValid{A \sbol{CombinatorialDerivation} MUST NOT contain two or more \sbol{hasVariableFeature} properties that refer to \sbol{VariableFeature} objects with a \sbol{variable} property that contain the same \sbol{IRI}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
\printModeling{A \sbol{CombinatorialDerivation}'s template \sbol{Component} SHOULD contain one or more \sbol{hasFeature} properties.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% This one isn't true: it's only true for collections that are created as part of the derivation process.
%\printModeling{If the \sbol{member} properties of a \sbol{Collection} refers only to objects with \prov{wasDerivedFrom} properties that refer to a \sbol{CombinatorialDerivation}, then the \prov{wasDerivedFrom} property of the \sbol{Collection} SHOULD also refer to the \sbol{CombinatorialDerivation}.
%\\ Reference: \sec{sec:CombinatorialDerivation}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Derivation tracking
\printModeling{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then the \prov{wasDerivedFrom} properties of each child \sbol{Feature} of the \sbol{Component} should refer to a \sbol{Feature} in the template \sbol{Component} of the \sbol{CombinatorialDerivation}
\\ Reference: \sec{sec:CombinatorialDerivation}}
\printModeling{If the \prov{wasDerivedFrom} property of a \sbol{Collection} refers to a \sbol{CombinatorialDerivation}, then the \prov{wasDerivedFrom} properties of the objects that are referred to by its \sbol{member} properties SHOULD also refer to the \sbol{CombinatorialDerivation}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Consistency with template
% derived type matches template type
\printModeling{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then the \sbolmult{type:C}{type} properties of this \sbol{Component}
SHOULD contain all \sbol{IRI}s contained by the \sbolmult{type:C}{type} properties of the template
\sbol{Component} of the \sbol{CombinatorialDerivation}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% derived role matches template role
\printModeling{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then the \sbolmult{role:C}{role} properties of this \sbol{Component}
SHOULD contain all \sbol{IRI}s contained by the \sbolmult{role:C}{role} properties of the template
\sbol{Component} of the \sbol{CombinatorialDerivation}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% static features have identical properties
\printComplete{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then for any \sbol{Feature} in the \sbol{Component} with a \prov{wasDerivedFrom} property referring to a static \sbol{Feature} in the template \sbol{Component} of the \sbol{CombinatorialDerivation}, that derived \sbol{Feature} MUST have properties identical to those of the static \sbol{Feature}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% static features map one to one
\printModeling{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then each static \sbol{Feature} in the template \sbol{Component} SHOULD be referred to by a\\ \prov{wasDerivedFrom} property from exactly one \sbol{Feature} in the derived \sbol{Component}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% variable features are replaced by a corresponding cardinality
\printModeling{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then each variable \sbol{Feature} in the template \sbol{Component} SHOULD be referred to by a\\ \prov{wasDerivedFrom} property from a number of \sbol{Feature} objects in the derived \sbol{Component} that is compatible with the \sbol{cardinality} property of the corresponding \sbol{VariableFeature}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% variable features derivatives come from VariableFeature values
\printComplete{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then for any \sbol{SubComponent} in the \sbol{Component} with a \prov{wasDerivedFrom} property referring to a variable \sbol{Feature} in the template \sbol{Component} of the \sbol{CombinatorialDerivation}, that derived \sbol{SubComponent} MUST have an \sbol{instanceOf} property that refers to a \sbol{Component} specified by the corresponding \sbol{VariableFeature}.
In particular, that \sbol{Component} must be a value of the \sbol{variant} property,
a \sbol{member} or recursive \sbol{member} of a \sbol{Collection} that is a value of the \sbol{variantCollection} property,
or a \sbol{Component} with a \prov{wasDerivedFrom} property that refers to a
\sbol{CombinatorialDerivation} specified by a \sbol{variantDerivation} property of the \sbol{VariableFeature}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% derived features follow template constraints
\printComplete{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a
\sbol{CombinatorialDerivation} and the template \sbol{Component} of the
\sbol{CombinatorialDerivation} contains \sbol{Constraint} objects, then for any \sbol{Feature}
contained by the \sbol{Component} that has a \prov{wasDerivedFrom} property that refers to the \sbol{subject} or \sbol{object} \sbol{Feature} of any of the template \sbol{Constraint} objects, that feature MUST adhere to the \sbol{restriction} properties of the template \sbol{Constraint} objects.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% derived feature role matches template feature role
\printModeling{If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then for any \sbol{Feature} in the \sbol{Component} with a \prov{wasDerivedFrom} property referring to a variable \sbol{Feature} in the template \sbol{Component} of the \sbol{CombinatorialDerivation},
then the \sbolmult{role:F}{role} properties of that \sbol{Feature} SHOULD contain all \sbol{IRI}s contained by the \sbolmult{role:F}{role} properties of the template \sbol{Feature}.
\\ Reference: \sec{sec:CombinatorialDerivation}}
% derived feature type matches template feature type
\printModeling{Let the type-determining referent of a \sbol{Feature} be the \sbol{Feature} itself for a \sbol{LocalSubComponent} or \sbol{ExternallyDefined}, the \sbol{Component} referred by the \sbol{instanceOf} property of a \sbol{SubComponent} and the type-determining referent of the \sbol{Feature} referred to be a \sbol{ComponentReference}.\\
If the \prov{wasDerivedFrom} property of a \sbol{Component} refers to a \sbol{CombinatorialDerivation}, then for any \sbol{Feature} in the \sbol{Component} with a \prov{wasDerivedFrom} property referring to a variable \sbol{Feature} in the template \sbol{Component} of the \sbol{CombinatorialDerivation},
then the \sbolmult{type:C}{type} properties of the \sbol{Feature}'s type-determining referent SHOULD contain all \sbol{IRI}s contained by the \sbolmult{type:C}{type} properties of the template \sbol{Feature}'s type-determining referent.
\\ Reference: \sec{sec:CombinatorialDerivation}}
\subsubsection*{Rules for the \class{VariableFeature} class}
\setcounter{sbolCtr}{12201}
\printValid{The \sbol{IRI} contained by the \sbol{cardinality} property of a \sbol{VariableFeature} MUST come from
\ref{tbl:cardinality}.
\\ Reference: \sec{sec:VariableFeature}}
\printComplete{The \sbol{Feature} referenced by the \sbol{variable} property of a \sbol{VariableFeature} MUST be contained by the template \sbol{Component} of the \sbol{CombinatorialDerivation} that contains the \sbol{VariableFeature}.
\\ Reference: \sec{sec:VariableFeature}}
\printComplete{The \sbol{member} properties of a \sbol{Collection} that is referred to by the \sbol{variantCollection} property of a \sbol{VariableFeature} MUST refer only to \sbol{Component} objects or to \sbol{Collection} objects that themselves contain only \sbol{Component} or \sbol{Collection} objects, recursively.
\\ Reference: \sec{sec:VariableFeature}}
\printComplete{\sbol{VariableFeature} objects MUST NOT form circular reference chains via their \sbol{variantDerivation} properties and parent \sbol{CombinatorialDerivation} objects.
\\ Reference: \sec{sec:VariableFeature}}
\subsubsection*{Rules for the \class{Implementation} class}
\setcounter{sbolCtr}{12301}
\printWarning{Each \prov{wasDerivedFrom} property of an \sbol{Implementation} MUST refer to a \sbol{Component} that contains a description of the intended nature of the actual object indicated by the \sbol{Implementation}.
\\ Reference: \sec{sec:Implementation}}
\printWarning{All \prov{wasDerivedFrom} properties of an \sbol{Implementation} MUST refer to non-conflicting \sbol{Component} descriptions.
\\ Reference: \sec{sec:Implementation}}
\printWarning{If the \sbol{built} property of an \sbol{Implementation} is set, then the \sbol{Component} it refers to MUST be a faithful description of the actual object indicated by the \sbol{Implementation}.
\\ Reference: \sec{sec:Implementation}}
%\subsubsection*{Rules for the \class{ExperimentalData} class}
%\setcounter{sbolCtr}{12401}
\subsubsection*{Rules for the \class{Model} class}
\setcounter{sbolCtr}{12501}
\printWarning{The \sbol{IRI} contained by the \sbolmult{source:M}{source} property of a \sbol{Model} MUST specify the location of the model's source file.\\ Reference: \sec{sec:Model}}
\printWarning{The \sbol{IRI} contained by the \sbol{language} property of a \sbol{Model} MUST specify the language in which the model is encoded.\\ Reference: \sec{sec:Model}}
\printWarning{The \sbol{language} property of a \sbol{Model} MUST contain a \sbol{URL} from \ref{tbl:model_types} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:Model}}
\printModeling{The \sbol{language} property of a \sbol{Model} SHOULD contain a \sbol{URL} that refers to a term from the EDAM ontology.\\ Reference: \sec{sec:Model}}
\printWarning{The \sbol{IRI} contained by the \sbol{framework} property of a \sbol{Model} MUST specify the modeling framework of the model.\\ Reference: \sec{sec:Model}}
\printWarning{The \sbol{framework} property of a \sbol{Model} MUST contain a \sbol{URL} from \ref{tbl:model_frameworks} if it is well-described by this \sbol{URL}.\\ Reference: \sec{sec:Model}}
\printModeling{The \sbol{framework} property SHOULD contain a \sbol{URL} that refers to a term from the modeling framework branch of the SBO.\\ Reference: \sec{sec:Model}}
%\subsubsection*{Rules for the \class{Collection} class}
%\setcounter{sbolCtr}{12601}
%
%\subsubsection*{Rules for the \class{Experiment} class}
%\setcounter{sbolCtr}{12701}
\subsubsection*{Rules for the \class{Attachment} class}
\setcounter{sbolCtr}{12801}
\printWarning{The \sbolmult{source:A}{source} property of an \sbol{Attachment} MUST specify the location of the model's source file.\\ Reference: \sec{sec:Attachment}}
\printWarning{The \sbol{IRI} contained by the \sbol{format} property of an \sbol{Attachment} MUST specify the file type of the attachment.\\ Reference: \sec{sec:Attachment}}
\printModeling{The \sbol{format} property of an \sbol{Attachment} SHOULD contain a \sbol{URL} that refers to a term from the EDAM ontology.\\ Reference: \sec{sec:Attachment}}
\printWarning{The \sbol{size} property, if specified, MUST indicate file size in bytes.\\ Reference: \sec{sec:Attachment}}
\printWarning{The \sbol{hash} property, if specified, MUST be a hash value for the file contents represented as a hexadecimal digest.\\ Reference: \sec{sec:Attachment}}
\printWarning{The \sbol{hashAlgorithm}, if specified, MUST be the name of a hash algorithm used to generate the value of the \sbol{hash} property.\\ Reference: \sec{sec:Attachment}}
\printModeling{The \sbol{hashAlgorithm} property of an \sbol{Attachment} SHOULD be a hash name \sbol{String} from the \href{https://www.iana.org/assignments/named-information/named-information.xhtml}{IANA Named Information Hash Algorithm Registry}, of which \texttt{sha3-256} is currently RECOMMENDED.\\ Reference: \sec{sec:Attachment}}
\printValid{If the \sbol{hash} property is set, then the \sbol{hashAlgorithm} MUST be set as well.\\ Reference: \sec{sec:Attachment}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PROV rules:
\subsubsection*{Rules for the \class{prov:Activity} class}
\setcounter{sbolCtr}{12901}
\printModeling{An \prov{Activity} with a \sbolmult{type:Activity}{type} from \ref{tbl:activity_types} SHOULD NOT have child \prov{Usage} objects that have \provmult{hadRole:U}{hadRole} properties from \ref{tbl:activity_types} other than the same \sbol{URL} or the \sbol{URL} of the preceding stage given in \ref{tbl:dbtl_stages}.\\ Reference: \sec{sec:prov:Activity}}
\printModeling{If an \prov{Activity} has a \sbolmult{type:Activity}{type} property with a value from \ref{tbl:activity_types}, then every child \prov{Association} SHOULD have a \provmult{hadRole:A}{hadRole} property with the same value. \\ Reference: \sec{sec:prov:Activity}}
\subsubsection*{Rules for the \class{prov:Usage} class}
\setcounter{sbolCtr}{13001}
\printModeling{If a \prov{Usage} has a \provmult{hadRole:U}{hadRole} property with a value from \ref{tbl:activity_types}, then its \prov{entity} property SHOULD refer to an object of the corresponding type in \ref{tbl:dbtl_stages}.\\ Reference: \sec{sec:prov:Usage}}
%\subsubsection*{Rules for the \class{prov:Association} class}
%\setcounter{sbolCtr}{13101}
%
%
%\subsubsection*{Rules for the \class{prov:Plan} class}
%\setcounter{sbolCtr}{13201}
%
%
%\subsubsection*{Rules for the \class{prov:Agent} class}
%\setcounter{sbolCtr}{13301}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% OM rules:
\subsubsection*{Rules for the \class{om:Measure} class}
\setcounter{sbolCtr}{13401}
\printModeling{If a \om{Measure} includes a \sbolmult{type:Measure}{type} property, then exactly one of the \sbol{IRI}s that this property contains SHOULD refer to a term from the systems description parameter branch of the SBO.\\ Reference: \sec{sec:om:Measure}}
\subsubsection*{Rules for the \class{om:Unit} class}
\setcounter{sbolCtr}{13501}
\printModeling{If both of the \sbol{name} property and \ommult{label:Unit}{label} properties of a \om{Unit} are non-empty, then they SHOULD contain identical \sbol{String}s.\\ Reference: \sec{sec:om:Unit}}
\printModeling{If both of the \sbol{description} property and \ommult{comment:Unit}{comment} properties of a \om{Unit} are non-empty, then they SHOULD contain identical \sbol{String}s.\\ Reference: \sec{sec:om:Unit}}
%\subsubsection*{Rules for the \class{om:SingularUnit} class}
%\setcounter{sbolCtr}{13601}
%
%
%\subsubsection*{Rules for the \class{om:CompoundUnit} class}
%\setcounter{sbolCtr}{13701}
%
%
%\subsubsection*{Rules for the \class{om:UnitMultiplication} class}
%\setcounter{sbolCtr}{13801}
%
%
%\subsubsection*{Rules for the \class{om:UnitDivision} class}
%\setcounter{sbolCtr}{13901}
%
%
%\subsubsection*{Rules for the \class{om:UnitExponentiation} class}
%\setcounter{sbolCtr}{14001}
%
%
%\subsubsection*{Rules for the \class{om:PrefixedUnit} class}
%\setcounter{sbolCtr}{14101}
\subsubsection*{Rules for the \class{om:Prefix} class}
\setcounter{sbolCtr}{14201}
\printModeling{If both of the \sbol{name} property and \ommult{label:Prefix}{label} properties of a \om{Prefix} are non-empty, then they SHOULD contain identical \sbol{String}s.\\ Reference: \sec{sec:om:Prefix}}
\printModeling{If both of the \sbol{description} property and \ommult{comment:Prefix}{comment} properties of a \om{Prefix} are non-empty, then they SHOULD contain identical \sbol{String}s.\\ Reference: \sec{sec:om:Prefix}}
%\subsubsection*{Rules for the \class{om:SIPrefix} class}
%\setcounter{sbolCtr}{14301}
%
%\subsubsection*{Rules for the \class{om:BinaryPrefix} class}
%\setcounter{sbolCtr}{14401}