@prefix : <https://ontology.inferal.com/modules/type-system/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix mod: <https://w3id.org/mod#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix pubacc: <https://ontology.inferal.com/modules/publication-access/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

:
    a owl:Ontology, pubacc:PublicationManagedOntology ;
    dcterms:accessRights pubacc:PublicAccess ;
    dcterms:title "Type System Ontology" ;
    dcterms:description "Type-system terms for scalar, structured, literal, union, enum, callable, template, value, and type-relation facts." ;
    dcterms:license <https://creativecommons.org/licenses/by/4.0/> ;
    vann:preferredNamespacePrefix "ts" ;
    vann:preferredNamespaceUri "https://ontology.inferal.com/modules/type-system/" ;
    mod:status "draft" ;
    rdfs:comment "This module describes types and type-bearing structure only. Runtime integrations, service resources, wire formats, generated artifacts, and presentation-specific concerns belong in separate modules." ;
    owl:versionInfo "0.1.0" .

################################################################################
# Core identity
################################################################################

:Entity
    a rdfs:Class ;
    rdfs:label "entity" ;
    rdfs:comment "A resource that participates in a type-system graph." .

:Vocabulary
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "vocabulary" ;
    rdfs:comment "A named collection of type-system declarations." .

:Namespace
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "namespace" ;
    rdfs:comment "A semantic grouping scope for declarations." .

:Declaration
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "declaration" ;
    rdfs:comment "A named binding for a type, value, alias, or namespace-local resource." .

:TypeDeclaration
    a rdfs:Class ;
    rdfs:subClassOf :Declaration ;
    rdfs:label "type declaration" ;
    rdfs:comment "A named declaration whose declared resource is a type." .

:ValueDeclaration
    a rdfs:Class ;
    rdfs:subClassOf :Declaration ;
    rdfs:label "value declaration" ;
    rdfs:comment "A named declaration whose declared resource is a value." .

:AliasDeclaration
    a rdfs:Class ;
    rdfs:subClassOf :Declaration ;
    rdfs:label "alias declaration" ;
    rdfs:comment "A named declaration whose declared resource is an alias." .

:Alias
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "alias" ;
    rdfs:comment "A type-system shorthand that points at another type-system resource." .

################################################################################
# Type taxonomy
################################################################################

:Type
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "type" ;
    rdfs:comment "A value type assignable to fields, parameters, results, collection elements, alternatives, enum members, template parameters, or values." .

:AnonymousTypeExpression
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "anonymous type expression" ;
    rdfs:comment "An inline type expression that has no declaration name of its own." .

:IntrinsicType
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "intrinsic type" ;
    rdfs:comment "A built-in type supplied by the type system." .

:DataType
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "data type" ;
    rdfs:comment "A type that describes data values." .

:Scalar
    a rdfs:Class ;
    rdfs:subClassOf :DataType ;
    rdfs:label "scalar" ;
    rdfs:comment "An atomic primitive or user-defined value type." .

:StringType
    a rdfs:Class ;
    rdfs:subClassOf :Scalar ;
    rdfs:label "string type" ;
    rdfs:comment "A scalar textual string type." .

:UrlType
    a rdfs:Class ;
    rdfs:subClassOf :StringType ;
    rdfs:label "URL type" ;
    rdfs:comment "A string-like scalar constrained to URL values." .

:BytesType
    a rdfs:Class ;
    rdfs:subClassOf :Scalar ;
    rdfs:label "bytes type" ;
    rdfs:comment "A scalar byte-sequence type." .

:BooleanType
    a rdfs:Class ;
    rdfs:subClassOf :Scalar ;
    rdfs:label "boolean type" ;
    rdfs:comment "A scalar boolean type." .

:NumericType
    a rdfs:Class ;
    rdfs:subClassOf :Scalar ;
    rdfs:label "numeric type" ;
    rdfs:comment "A scalar numeric type." .

:IntegerType
    a rdfs:Class ;
    rdfs:subClassOf :NumericType ;
    rdfs:label "integer type" ;
    rdfs:comment "A whole-number scalar type." .

:FloatType
    a rdfs:Class ;
    rdfs:subClassOf :NumericType ;
    rdfs:label "float type" ;
    rdfs:comment "A floating-point scalar type." .

:DecimalType
    a rdfs:Class ;
    rdfs:subClassOf :NumericType ;
    rdfs:label "decimal type" ;
    rdfs:comment "A decimal scalar type." .

:TemporalType
    a rdfs:Class ;
    rdfs:subClassOf :Scalar ;
    rdfs:label "temporal type" ;
    rdfs:comment "A scalar date, time, date-time, or duration type." .

:DateType
    a rdfs:Class ;
    rdfs:subClassOf :TemporalType ;
    rdfs:label "date type" ;
    rdfs:comment "A scalar calendar date type." .

:TimeType
    a rdfs:Class ;
    rdfs:subClassOf :TemporalType ;
    rdfs:label "time type" ;
    rdfs:comment "A scalar clock time type." .

:DateTimeType
    a rdfs:Class ;
    rdfs:subClassOf :TemporalType ;
    rdfs:label "date-time type" ;
    rdfs:comment "A scalar instant or date-time type." .

:DurationType
    a rdfs:Class ;
    rdfs:subClassOf :TemporalType ;
    rdfs:label "duration type" ;
    rdfs:comment "A scalar duration or time-period type." .

:TemporalKind
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "temporal kind" ;
    rdfs:comment "A controlled value-space category for temporal scalars." .

:TemporalZoneSemantics
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "temporal zone semantics" ;
    rdfs:comment "A controlled description of whether a temporal scalar carries zone or offset semantics." .

:NullType
    a rdfs:Class ;
    rdfs:subClassOf :IntrinsicType ;
    rdfs:label "null type" ;
    rdfs:comment "The type inhabited by null." .

:UnknownType
    a rdfs:Class ;
    rdfs:subClassOf :IntrinsicType ;
    rdfs:label "unknown type" ;
    rdfs:comment "An intrinsic placeholder for values whose specific type is unknown or unresolved." .

:AnyType
    a rdfs:Class ;
    rdfs:subClassOf :IntrinsicType ;
    rdfs:label "any type" ;
    rdfs:comment "An intrinsic type that suppresses normal assignability precision." .

:VoidType
    a rdfs:Class ;
    rdfs:subClassOf :IntrinsicType ;
    rdfs:label "void type" ;
    rdfs:comment "The absence of a result value." .

:NeverType
    a rdfs:Class ;
    rdfs:subClassOf :IntrinsicType ;
    rdfs:label "never type" ;
    rdfs:comment "The bottom type that no value can inhabit." .

:ErrorType
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "error type" ;
    rdfs:comment "A type that denotes an error case in a typed result space." .

################################################################################
# Structured types
################################################################################

:StructuredType
    a rdfs:Class ;
    rdfs:subClassOf :DataType ;
    rdfs:label "structured type" ;
    rdfs:comment "A data type with child slots, positions, keys, or alternatives." .

:CollectionType
    a rdfs:Class ;
    rdfs:subClassOf :StructuredType ;
    rdfs:label "collection type" ;
    rdfs:comment "A structured type whose values contain ordered or keyed child values." .

:RecordType
    a rdfs:Class ;
    rdfs:subClassOf :StructuredType ;
    rdfs:label "record type" ;
    rdfs:comment "A structured type with named fields." .

:RecordExpression
    a rdfs:Class ;
    rdfs:subClassOf :RecordType, :AnonymousTypeExpression ;
    rdfs:label "record expression" ;
    rdfs:comment "An anonymous record type expression." .

:RecordMapType
    a rdfs:Class ;
    rdfs:subClassOf :RecordType ;
    rdfs:label "record map type" ;
    rdfs:comment "A record-compatible type with arbitrary keyed fields of a common value type." .

:OptionRecordType
    a rdfs:Class ;
    rdfs:subClassOf :RecordType ;
    rdfs:label "option record type" ;
    rdfs:comment "A record type used as typed options or parameter bags." .

:ArrayType
    a rdfs:Class ;
    rdfs:subClassOf :CollectionType ;
    rdfs:label "array type" ;
    rdfs:comment "An ordered collection with a common element type." .

:ArrayExpression
    a rdfs:Class ;
    rdfs:subClassOf :ArrayType, :AnonymousTypeExpression ;
    rdfs:label "array expression" ;
    rdfs:comment "An anonymous array type expression." .

:TupleType
    a rdfs:Class ;
    rdfs:subClassOf :ArrayType ;
    rdfs:label "tuple type" ;
    rdfs:comment "A fixed-position ordered collection with per-position element types." .

:TupleExpression
    a rdfs:Class ;
    rdfs:subClassOf :TupleType, :AnonymousTypeExpression ;
    rdfs:label "tuple expression" ;
    rdfs:comment "An anonymous tuple type expression." .

:StreamType
    a rdfs:Class ;
    rdfs:subClassOf :DataType ;
    rdfs:label "stream type" ;
    rdfs:comment "A type whose values are delivered incrementally as elements of another type." .

:IntersectionType
    a rdfs:Class ;
    rdfs:subClassOf :StructuredType ;
    rdfs:label "intersection type" ;
    rdfs:comment "A type whose values satisfy all constituent types." .

:IntersectionExpression
    a rdfs:Class ;
    rdfs:subClassOf :IntersectionType, :AnonymousTypeExpression ;
    rdfs:label "intersection expression" ;
    rdfs:comment "An anonymous intersection type expression." .

:TypedSlot
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "typed slot" ;
    rdfs:comment "A field, tuple element, parameter, result, alternative, or lookup slot that carries values of a type." .

:Field
    a rdfs:Class ;
    rdfs:subClassOf :TypedSlot ;
    rdfs:label "field" ;
    rdfs:comment "A named slot on a record type." .

:FieldKey
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "field key" ;
    rdfs:comment "The declared key for a record field." .

:FieldKeyKind
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "field key kind" ;
    rdfs:comment "A controlled category for field keys." .

:TupleElement
    a rdfs:Class ;
    rdfs:subClassOf :TypedSlot ;
    rdfs:label "tuple element" ;
    rdfs:comment "A typed position in a tuple type." .

:IndexerSlot
    a rdfs:Class ;
    rdfs:subClassOf :TypedSlot ;
    rdfs:label "indexer slot" ;
    rdfs:comment "A typed lookup slot on an array or map-like type." .

################################################################################
# Choice types
################################################################################

:Union
    a rdfs:Class ;
    rdfs:subClassOf :DataType ;
    rdfs:label "union" ;
    rdfs:comment "A type that admits values from one or more alternative types." .

:UnionExpression
    a rdfs:Class ;
    rdfs:subClassOf :Union, :AnonymousTypeExpression ;
    rdfs:label "union expression" ;
    rdfs:comment "An anonymous union type expression." .

:NullableType
    a rdfs:Class ;
    rdfs:subClassOf :Union ;
    rdfs:label "nullable type" ;
    rdfs:comment "A union whose alternatives include null and one non-null base type." .

:UnionAlternative
    a rdfs:Class ;
    rdfs:subClassOf :TypedSlot ;
    rdfs:label "union alternative" ;
    rdfs:comment "One ordered alternative of a union type." .

:UnionVariant
    a rdfs:Class ;
    rdfs:subClassOf :UnionAlternative, :Type ;
    rdfs:label "union variant" ;
    rdfs:comment "A named union alternative that can also be referenced as a type." .

:Discriminator
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "discriminator" ;
    rdfs:comment "A type-level selector that distinguishes alternatives in a union." .

:DiscriminatorEnvelope
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "discriminator envelope" ;
    rdfs:comment "A controlled discriminator placement strategy." .

:Enum
    a rdfs:Class ;
    rdfs:subClassOf :DataType ;
    rdfs:label "enum" ;
    rdfs:comment "A type with a finite set of named members." .

:EnumMember
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "enum member" ;
    rdfs:comment "One named member of an enum type. A member can be referenced in type position and can denote a value." .

################################################################################
# Callable and template types
################################################################################

:CallableType
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "callable type" ;
    rdfs:comment "A function-like type with typed parameters and results." .

:CallableSetType
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "callable set type" ;
    rdfs:comment "A type-level grouping of callable signatures." .

:InterfaceType
    a rdfs:Class ;
    rdfs:subClassOf :CallableSetType ;
    rdfs:label "interface type" ;
    rdfs:comment "A named callable set type." .

:CallableSetMembership
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "callable set membership" ;
    rdfs:comment "A relation between a callable set type and one callable type." .

:ParameterSlot
    a rdfs:Class ;
    rdfs:subClassOf :TypedSlot ;
    rdfs:label "parameter slot" ;
    rdfs:comment "A typed input slot of a callable type." .

:ResultSlot
    a rdfs:Class ;
    rdfs:subClassOf :TypedSlot ;
    rdfs:label "result slot" ;
    rdfs:comment "A typed output slot of a callable type." .

:TemplateParameter
    a rdfs:Class ;
    rdfs:subClassOf :TypedSlot ;
    rdfs:label "template parameter" ;
    rdfs:comment "A type-system parameter used to instantiate a generic type or callable." .

:TypeParameter
    a rdfs:Class ;
    rdfs:subClassOf :TemplateParameter, :Type ;
    rdfs:label "type parameter" ;
    rdfs:comment "A template parameter whose arguments are types." .

:ValueParameter
    a rdfs:Class ;
    rdfs:subClassOf :TemplateParameter ;
    rdfs:label "value parameter" ;
    rdfs:comment "A template parameter whose arguments are values." .

:TypeOrValueParameter
    a rdfs:Class ;
    rdfs:subClassOf :TemplateParameter ;
    rdfs:label "type-or-value parameter" ;
    rdfs:comment "A template parameter that can accept either a type argument or a value argument." .

:TemplateInstantiation
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "template instantiation" ;
    rdfs:comment "The result of applying template arguments to a generic type-system entity." .

:TemplateArgument
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "template argument" ;
    rdfs:comment "One supplied argument for a template instantiation." .

:TypeArgument
    a rdfs:Class ;
    rdfs:subClassOf :TemplateArgument ;
    rdfs:label "type argument" ;
    rdfs:comment "A template argument whose supplied expression is a type." .

:ValueArgument
    a rdfs:Class ;
    rdfs:subClassOf :TemplateArgument ;
    rdfs:label "value argument" ;
    rdfs:comment "A template argument whose supplied expression is a value." .

:ValueOfType
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "value-of type" ;
    rdfs:comment "A type-level constraint whose accepted values have a declared or inferred type assignable to a base type." .

:TypeOfValue
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "type-of value" ;
    rdfs:comment "A type expression produced from the declared or inferred type of a value." .

################################################################################
# Literal types and values
################################################################################

:LiteralType
    a rdfs:Class ;
    rdfs:subClassOf :Type ;
    rdfs:label "literal type" ;
    rdfs:comment "A type-level literal expression, including exact singleton literal value spaces, template literal value spaces, and enum or union member references used in literal position." .

:LiteralKind
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "literal kind" ;
    rdfs:comment "A controlled category for literal type resources." .

:StringLiteralType
    a rdfs:Class ;
    rdfs:subClassOf :LiteralType ;
    rdfs:label "string literal type" ;
    rdfs:comment "A literal type whose only inhabitant is a specific string value." .

:StringTemplateLiteralType
    a rdfs:Class ;
    rdfs:subClassOf :LiteralType ;
    rdfs:label "string template literal type" ;
    rdfs:comment "A literal type assembled from string literal and interpolation parts." .

:StringTemplatePart
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "string template part" ;
    rdfs:comment "A literal text or interpolation part of a string template literal." .

:NumericLiteralType
    a rdfs:Class ;
    rdfs:subClassOf :LiteralType ;
    rdfs:label "numeric literal type" ;
    rdfs:comment "A literal type whose only inhabitant is a specific numeric value." .

:BooleanLiteralType
    a rdfs:Class ;
    rdfs:subClassOf :LiteralType ;
    rdfs:label "boolean literal type" ;
    rdfs:comment "A literal type whose only inhabitant is true or false." .

:NullLiteralType
    a rdfs:Class ;
    rdfs:subClassOf :LiteralType ;
    rdfs:label "null literal type" ;
    rdfs:comment "A literal type whose only inhabitant is null." .

:EnumMemberReferenceLiteralType
    a rdfs:Class ;
    rdfs:subClassOf :LiteralType ;
    rdfs:label "enum member reference literal type" ;
    rdfs:comment "A literal-like type expression produced by referring to an enum member in type position." .

:UnionVariantReferenceLiteralType
    a rdfs:Class ;
    rdfs:subClassOf :LiteralType ;
    rdfs:label "union variant reference literal type" ;
    rdfs:comment "A literal-like type expression produced by referring to a union variant in type position." .

:Value
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "value" ;
    rdfs:comment "A value in the type-system graph." .

:ConstValue
    a rdfs:Class ;
    rdfs:subClassOf :Value ;
    rdfs:label "const value" ;
    rdfs:comment "A named value binding with a declared or inferred type." .

:ScalarValue
    a rdfs:Class ;
    rdfs:subClassOf :Value ;
    rdfs:label "scalar value" ;
    rdfs:comment "A scalar value." .

:StringValue
    a rdfs:Class ;
    rdfs:subClassOf :ScalarValue ;
    rdfs:label "string value" ;
    rdfs:comment "A scalar value whose concrete value is a string." .

:NumericValue
    a rdfs:Class ;
    rdfs:subClassOf :ScalarValue ;
    rdfs:label "numeric value" ;
    rdfs:comment "A scalar value whose concrete value is numeric." .

:BooleanValue
    a rdfs:Class ;
    rdfs:subClassOf :ScalarValue ;
    rdfs:label "boolean value" ;
    rdfs:comment "A scalar value whose concrete value is boolean." .

:NullValue
    a rdfs:Class ;
    rdfs:subClassOf :Value ;
    rdfs:label "null value" ;
    rdfs:comment "The null value." .

:EnumValue
    a rdfs:Class ;
    rdfs:subClassOf :Value ;
    rdfs:label "enum value" ;
    rdfs:comment "A value that denotes a specific enum member." .

:ObjectValue
    a rdfs:Class ;
    rdfs:subClassOf :Value ;
    rdfs:label "object value" ;
    rdfs:comment "An object value with named members." .

:ObjectValueMember
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "object value member" ;
    rdfs:comment "A named member of an object value." .

:ArrayValue
    a rdfs:Class ;
    rdfs:subClassOf :Value ;
    rdfs:label "array value" ;
    rdfs:comment "An array value with ordered items." .

:ArrayValueItem
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "array value item" ;
    rdfs:comment "An ordered item of an array value." .

:ScalarInitializer
    a rdfs:Class ;
    rdfs:subClassOf :CallableType ;
    rdfs:label "scalar initializer" ;
    rdfs:comment "A callable type-level resource that constructs or parses values for a scalar type." .

:ScalarConstructorInitializer
    a rdfs:Class ;
    rdfs:subClassOf :ScalarInitializer ;
    rdfs:label "scalar constructor initializer" ;
    rdfs:comment "A scalar initializer that constructs a scalar value directly from an input value." .

:ScalarInitializerSemanticKind
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "scalar initializer semantic kind" ;
    rdfs:comment "A controlled category for scalar initializer behavior." .

:ScalarInitializerCall
    a rdfs:Class ;
    rdfs:subClassOf :Value ;
    rdfs:label "scalar initializer call" ;
    rdfs:comment "A value produced by invoking a scalar initializer." .

:InitializerArgument
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "initializer argument" ;
    rdfs:comment "One supplied argument in a scalar initializer call." .

################################################################################
# Type relations
################################################################################

:TypeRelation
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "type relation" ;
    rdfs:comment "A first-class assertion about the relationship between two types." .

:AssignableTypeRelation
    a rdfs:Class ;
    rdfs:subClassOf :TypeRelation ;
    rdfs:label "assignable type relation" ;
    rdfs:comment "A type relation whose source type can be assigned to the target type." .

:SubtypeRelation
    a rdfs:Class ;
    rdfs:subClassOf :AssignableTypeRelation ;
    rdfs:label "subtype relation" ;
    rdfs:comment "A type relation whose source type is a subtype of the target type." .

:ExactTypeRelation
    a rdfs:Class ;
    rdfs:subClassOf :AssignableTypeRelation ;
    rdfs:label "exact type relation" ;
    rdfs:comment "A type relation whose source and target have the same inhabited shape or value space." .

:NonAssignableTypeRelation
    a rdfs:Class ;
    rdfs:subClassOf :TypeRelation ;
    rdfs:label "non-assignable type relation" ;
    rdfs:comment "A type relation whose source type cannot be assigned to the target type." .

:TypeRelationEvidence
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "type relation evidence" ;
    rdfs:comment "Evidence attached to a first-class type relation." .

:FieldMatch
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "field match" ;
    rdfs:comment "Evidence that compares one source field with one target field." .

:AlternativeMatch
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "alternative match" ;
    rdfs:comment "Evidence that compares one source union alternative with one target alternative or covering type." .

:TupleElementMatch
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "tuple element match" ;
    rdfs:comment "Evidence that compares one source tuple element with one target tuple element." .

:CollectionElementTypeMatch
    a rdfs:Class ;
    rdfs:subClassOf :Entity ;
    rdfs:label "collection element type match" ;
    rdfs:comment "Evidence that compares collection element value spaces." .

################################################################################
# Object properties
################################################################################

:hasDeclaration
    a rdf:Property ;
    rdfs:label "has declaration" ;
    rdfs:comment "Connects a vocabulary or namespace to a declaration it owns." ;
    rdfs:domain :Entity ;
    rdfs:range :Declaration .

:declares
    a rdf:Property ;
    rdfs:label "declares" ;
    rdfs:comment "Connects a declaration to the type-system resource it binds." ;
    rdfs:domain :Declaration ;
    rdfs:range :Entity .

:aliasTarget
    a rdf:Property ;
    rdfs:label "alias target" ;
    rdfs:comment "Connects an alias to its target type-system resource." ;
    rdfs:domain :Alias ;
    rdfs:range :Entity .

:declaredType
    a rdf:Property ;
    rdfs:label "declared type" ;
    rdfs:comment "Connects a value to its explicitly declared type." ;
    rdfs:domain :Value ;
    rdfs:range :Type .

:inferredType
    a rdf:Property ;
    rdfs:label "inferred type" ;
    rdfs:comment "Connects a value to its inferred type." ;
    rdfs:domain :Value ;
    rdfs:range :Type .

:defaultValue
    a rdf:Property ;
    rdfs:label "default value" ;
    rdfs:comment "Connects a typed slot or parameter to its default value." ;
    rdfs:domain :Entity ;
    rdfs:range :Value .

:subtypeOf
    a rdf:Property ;
    rdfs:label "subtype of" ;
    rdfs:comment "Connects a source type to a supertype." ;
    rdfs:domain :Type ;
    rdfs:range :Type .

:assignableTo
    a rdf:Property ;
    rdfs:label "assignable to" ;
    rdfs:comment "Connects a source type to a target type to which values of the source can be assigned." ;
    rdfs:domain :Type ;
    rdfs:range :Type .

:baseScalar
    a rdf:Property ;
    rdfs:label "base scalar" ;
    rdfs:comment "Connects a scalar to the scalar it directly refines." ;
    rdfs:domain :Scalar ;
    rdfs:range :Scalar .

:standardBaseScalar
    a rdf:Property ;
    rdfs:label "standard base scalar" ;
    rdfs:comment "Connects a scalar to its nearest standard scalar value space." ;
    rdfs:domain :Scalar ;
    rdfs:range :Scalar .

:numericRangeAssignableTo
    a rdf:Property ;
    rdfs:subPropertyOf :assignableTo ;
    rdfs:label "numeric range assignable to" ;
    rdfs:comment "Connects numeric scalar types whose value ranges make assignment valid." ;
    rdfs:domain :NumericType ;
    rdfs:range :NumericType .

:temporalKind
    a rdf:Property ;
    rdfs:label "temporal kind" ;
    rdfs:comment "Connects a temporal scalar to its value-space category." ;
    rdfs:domain :TemporalType ;
    rdfs:range :TemporalKind .

:temporalZoneSemantics
    a rdf:Property ;
    rdfs:label "temporal zone semantics" ;
    rdfs:comment "Connects a temporal scalar to its zone or offset semantics." ;
    rdfs:domain :TemporalType ;
    rdfs:range :TemporalZoneSemantics .

:relationSourceType
    a rdf:Property ;
    rdfs:label "relation source type" ;
    rdfs:comment "The source type of a type relation." ;
    rdfs:domain :TypeRelation ;
    rdfs:range :Type .

:relationTargetType
    a rdf:Property ;
    rdfs:label "relation target type" ;
    rdfs:comment "The target type of a type relation." ;
    rdfs:domain :TypeRelation ;
    rdfs:range :Type .

:hasEvidence
    a rdf:Property ;
    rdfs:label "has evidence" ;
    rdfs:comment "Connects a type relation to evidence supporting it." ;
    rdfs:domain :TypeRelation ;
    rdfs:range :TypeRelationEvidence .

:evidenceRelation
    a rdf:Property ;
    rdfs:label "evidence relation" ;
    rdfs:comment "Connects evidence to the type relation it supports." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range :TypeRelation .

:evidenceSourceType
    a rdf:Property ;
    rdfs:label "evidence source type" ;
    rdfs:comment "The source type described by type relation evidence." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range :Type .

:evidenceTargetType
    a rdf:Property ;
    rdfs:label "evidence target type" ;
    rdfs:comment "The target type described by type relation evidence." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range :Type .

:hasFieldMatch
    a rdf:Property ;
    rdfs:label "has field match" ;
    rdfs:comment "Connects type relation evidence to field-level match evidence." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range :FieldMatch .

:hasAlternativeMatch
    a rdf:Property ;
    rdfs:label "has alternative match" ;
    rdfs:comment "Connects type relation evidence to union-alternative match evidence." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range :AlternativeMatch .

:hasTupleElementMatch
    a rdf:Property ;
    rdfs:label "has tuple element match" ;
    rdfs:comment "Connects type relation evidence to tuple-element match evidence." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range :TupleElementMatch .

:hasCollectionElementTypeMatch
    a rdf:Property ;
    rdfs:label "has collection element type match" ;
    rdfs:comment "Connects type relation evidence to collection element-type match evidence." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range :CollectionElementTypeMatch .

:valueType
    a rdf:Property ;
    rdfs:label "value type" ;
    rdfs:comment "The type of values accepted by a typed slot." ;
    rdfs:domain :TypedSlot ;
    rdfs:range :Type .

:hasField
    a rdf:Property ;
    rdfs:label "has field" ;
    rdfs:comment "Connects a record type to one of its fields." ;
    rdfs:domain :RecordType ;
    rdfs:range :Field .

:fieldType
    a rdf:Property ;
    rdfs:subPropertyOf :valueType ;
    rdfs:label "field type" ;
    rdfs:comment "The value type of a field." ;
    rdfs:domain :Field ;
    rdfs:range :Type .

:fieldKey
    a rdf:Property ;
    rdfs:label "field key" ;
    rdfs:comment "Connects a field to its declared key." ;
    rdfs:domain :Field ;
    rdfs:range :FieldKey .

:fieldKeyKind
    a rdf:Property ;
    rdfs:label "field key kind" ;
    rdfs:comment "Connects a field key to its key kind." ;
    rdfs:domain :FieldKey ;
    rdfs:range :FieldKeyKind .

:elementType
    a rdf:Property ;
    rdfs:label "element type" ;
    rdfs:comment "The common element type of a collection type." ;
    rdfs:domain :CollectionType ;
    rdfs:range :Type .

:arrayValueType
    a rdf:Property ;
    rdfs:subPropertyOf :elementType ;
    rdfs:label "array value type" ;
    rdfs:comment "The element type accepted by an array type." ;
    rdfs:domain :ArrayType ;
    rdfs:range :Type .

:streamElementType
    a rdf:Property ;
    rdfs:label "stream element type" ;
    rdfs:comment "The element type delivered by a stream type." ;
    rdfs:domain :StreamType ;
    rdfs:range :Type .

:tupleElement
    a rdf:Property ;
    rdfs:label "tuple element" ;
    rdfs:comment "Connects a tuple type to one of its ordered elements." ;
    rdfs:domain :TupleType ;
    rdfs:range :TupleElement .

:tupleElementType
    a rdf:Property ;
    rdfs:subPropertyOf :valueType ;
    rdfs:label "tuple element type" ;
    rdfs:comment "The value type of a tuple element." ;
    rdfs:domain :TupleElement ;
    rdfs:range :Type .

:hasIndexerSlot
    a rdf:Property ;
    rdfs:label "has indexer slot" ;
    rdfs:comment "Connects a collection type to a lookup slot." ;
    rdfs:domain :CollectionType ;
    rdfs:range :IndexerSlot .

:indexerKeyType
    a rdf:Property ;
    rdfs:label "indexer key type" ;
    rdfs:comment "The key type accepted by an indexer slot." ;
    rdfs:domain :IndexerSlot ;
    rdfs:range :Type .

:indexerValueType
    a rdf:Property ;
    rdfs:subPropertyOf :valueType ;
    rdfs:label "indexer value type" ;
    rdfs:comment "The value type returned by an indexer slot." ;
    rdfs:domain :IndexerSlot ;
    rdfs:range :Type .

:recordKeyType
    a rdf:Property ;
    rdfs:label "record key type" ;
    rdfs:comment "The key type accepted by a record map." ;
    rdfs:domain :RecordMapType ;
    rdfs:range :Type .

:recordValueType
    a rdf:Property ;
    rdfs:subPropertyOf :additionalPropertyType ;
    rdfs:label "record value type" ;
    rdfs:comment "The value type accepted by a record map." ;
    rdfs:domain :RecordMapType ;
    rdfs:range :Type .

:additionalPropertyType
    a rdf:Property ;
    rdfs:label "additional property type" ;
    rdfs:comment "The type accepted by additional properties on a record-like type." ;
    rdfs:domain :RecordType ;
    rdfs:range :Type .

:additionalPropertiesRecord
    a rdf:Property ;
    rdfs:label "additional properties record" ;
    rdfs:comment "Connects a record type to the record-map type that describes its additional fields." ;
    rdfs:domain :RecordType ;
    rdfs:range :RecordMapType .

:intersectionConstituent
    a rdf:Property ;
    rdfs:label "intersection constituent" ;
    rdfs:comment "Connects an intersection type to one of its constituent types." ;
    rdfs:domain :IntersectionType ;
    rdfs:range :Type .

:hasUnionAlternative
    a rdf:Property ;
    rdfs:label "has union alternative" ;
    rdfs:comment "Connects a union to one of its alternatives." ;
    rdfs:domain :Union ;
    rdfs:range :UnionAlternative .

:alternativeType
    a rdf:Property ;
    rdfs:subPropertyOf :valueType ;
    rdfs:label "alternative type" ;
    rdfs:comment "The type admitted by a union alternative." ;
    rdfs:domain :UnionAlternative ;
    rdfs:range :Type .

:nullableBaseType
    a rdf:Property ;
    rdfs:label "nullable base type" ;
    rdfs:comment "The non-null base type admitted by a nullable type." ;
    rdfs:domain :NullableType ;
    rdfs:range :Type .

:admittedByUnion
    a rdf:Property ;
    rdfs:subPropertyOf :assignableTo ;
    rdfs:label "admitted by union" ;
    rdfs:comment "Connects a type to a union that admits values of that type." ;
    rdfs:domain :Type ;
    rdfs:range :Union .

:unionVariantOf
    a rdf:Property ;
    rdfs:label "union variant of" ;
    rdfs:comment "Connects a union variant to its owning union." ;
    rdfs:domain :UnionVariant ;
    rdfs:range :Union .

:hasDiscriminator
    a rdf:Property ;
    rdfs:label "has discriminator" ;
    rdfs:comment "Connects a union to a discriminator used to distinguish its alternatives." ;
    rdfs:domain :Union ;
    rdfs:range :Discriminator .

:discriminatorField
    a rdf:Property ;
    rdfs:label "discriminator field" ;
    rdfs:comment "Connects a discriminator to the field that carries the selector value." ;
    rdfs:domain :Discriminator ;
    rdfs:range :Field .

:discriminatorValue
    a rdf:Property ;
    rdfs:label "discriminator value" ;
    rdfs:comment "Connects a union alternative or variant to its selector value." ;
    rdfs:domain :UnionAlternative ;
    rdfs:range :Value .

:discriminatorEnvelope
    a rdf:Property ;
    rdfs:label "discriminator envelope" ;
    rdfs:comment "Connects a discriminator to its placement strategy." ;
    rdfs:domain :Discriminator ;
    rdfs:range :DiscriminatorEnvelope .

:hasEnumMember
    a rdf:Property ;
    rdfs:label "has enum member" ;
    rdfs:comment "Connects an enum to one of its members." ;
    rdfs:domain :Enum ;
    rdfs:range :EnumMember .

:enumMemberType
    a rdf:Property ;
    rdfs:label "enum member type" ;
    rdfs:comment "The value type used by an enum member." ;
    rdfs:domain :EnumMember ;
    rdfs:range :Type .

:enumMemberValue
    a rdf:Property ;
    rdfs:label "enum member value" ;
    rdfs:comment "The value denoted by an enum member." ;
    rdfs:domain :EnumMember ;
    rdfs:range :Value .

:enumMemberOf
    a rdf:Property ;
    rdfs:label "enum member of" ;
    rdfs:comment "Connects an enum member to its owning enum." ;
    rdfs:domain :EnumMember ;
    rdfs:range :Enum .

:hasParameterSlot
    a rdf:Property ;
    rdfs:label "has parameter slot" ;
    rdfs:comment "Connects a callable type to one of its parameter slots." ;
    rdfs:domain :CallableType ;
    rdfs:range :ParameterSlot .

:hasResultSlot
    a rdf:Property ;
    rdfs:label "has result slot" ;
    rdfs:comment "Connects a callable type to one of its result slots." ;
    rdfs:domain :CallableType ;
    rdfs:range :ResultSlot .

:parameterType
    a rdf:Property ;
    rdfs:subPropertyOf :valueType ;
    rdfs:label "parameter type" ;
    rdfs:comment "The value type accepted by a parameter slot." ;
    rdfs:domain :ParameterSlot ;
    rdfs:range :Type .

:resultType
    a rdf:Property ;
    rdfs:subPropertyOf :valueType ;
    rdfs:label "result type" ;
    rdfs:comment "The value type returned by a result slot." ;
    rdfs:domain :ResultSlot ;
    rdfs:range :Type .

:hasCallable
    a rdf:Property ;
    rdfs:label "has callable" ;
    rdfs:comment "Connects a callable set type to a callable type." ;
    rdfs:domain :CallableSetType ;
    rdfs:range :CallableType .

:membershipSet
    a rdf:Property ;
    rdfs:label "membership set" ;
    rdfs:comment "The callable set participating in a callable set membership." ;
    rdfs:domain :CallableSetMembership ;
    rdfs:range :CallableSetType .

:membershipCallable
    a rdf:Property ;
    rdfs:label "membership callable" ;
    rdfs:comment "The callable participating in a callable set membership." ;
    rdfs:domain :CallableSetMembership ;
    rdfs:range :CallableType .

:literalBaseType
    a rdf:Property ;
    rdfs:subPropertyOf :subtypeOf ;
    rdfs:label "literal base type" ;
    rdfs:comment "The base type inhabited by a literal type." ;
    rdfs:domain :LiteralType ;
    rdfs:range :Type .

:literalKind
    a rdf:Property ;
    rdfs:label "literal kind" ;
    rdfs:comment "Connects a literal type to its controlled literal category." ;
    rdfs:domain :LiteralType ;
    rdfs:range :LiteralKind .

:hasTemplatePart
    a rdf:Property ;
    rdfs:label "has template part" ;
    rdfs:comment "Connects a string template literal type to one of its ordered parts." ;
    rdfs:domain :StringTemplateLiteralType ;
    rdfs:range :StringTemplatePart .

:templatePartValue
    a rdf:Property ;
    rdfs:label "template part value" ;
    rdfs:comment "The literal value carried by a string template part." ;
    rdfs:domain :StringTemplatePart ;
    rdfs:range :Value .

:templatePartExpression
    a rdf:Property ;
    rdfs:label "template part expression" ;
    rdfs:comment "The value expression interpolated by a string template part." ;
    rdfs:domain :StringTemplatePart ;
    rdfs:range :Value .

:templatePartConformance
    a rdf:Property ;
    rdfs:label "template part conformance" ;
    rdfs:comment "A type relation proving that an interpolated value is string-compatible." ;
    rdfs:domain :StringTemplatePart ;
    rdfs:range :TypeRelation .

:hasTemplateParameter
    a rdf:Property ;
    rdfs:label "has template parameter" ;
    rdfs:comment "Connects a generic type-system entity to one of its template parameters." ;
    rdfs:domain :Entity ;
    rdfs:range :TemplateParameter .

:hasTypeParameter
    a rdf:Property ;
    rdfs:subPropertyOf :hasTemplateParameter ;
    rdfs:label "has type parameter" ;
    rdfs:comment "Connects a generic type-system entity to one of its type parameters." ;
    rdfs:domain :Entity ;
    rdfs:range :TypeParameter .

:hasValueParameter
    a rdf:Property ;
    rdfs:subPropertyOf :hasTemplateParameter ;
    rdfs:label "has value parameter" ;
    rdfs:comment "Connects a generic type-system entity to one of its value parameters." ;
    rdfs:domain :Entity ;
    rdfs:range :ValueParameter .

:hasTypeOrValueParameter
    a rdf:Property ;
    rdfs:subPropertyOf :hasTemplateParameter ;
    rdfs:label "has type-or-value parameter" ;
    rdfs:comment "Connects a generic type-system entity to one of its type-or-value parameters." ;
    rdfs:domain :Entity ;
    rdfs:range :TypeOrValueParameter .

:typeParameterConstraint
    a rdf:Property ;
    rdfs:label "type parameter constraint" ;
    rdfs:comment "The type bound that a type parameter argument must satisfy." ;
    rdfs:domain :TypeParameter ;
    rdfs:range :Type .

:typeParameterValueConstraint
    a rdf:Property ;
    rdfs:label "type parameter value constraint" ;
    rdfs:comment "A value-space bound that a template parameter argument must satisfy." ;
    rdfs:domain :TemplateParameter ;
    rdfs:range :ValueOfType .

:typeParameterDefaultType
    a rdf:Property ;
    rdfs:label "type parameter default type" ;
    rdfs:comment "The default type used when a type parameter argument is omitted." ;
    rdfs:domain :TypeParameter ;
    rdfs:range :Type .

:typeParameterDefaultValue
    a rdf:Property ;
    rdfs:label "type parameter default value" ;
    rdfs:comment "The default value used when a value parameter argument is omitted." ;
    rdfs:domain :TemplateParameter ;
    rdfs:range :Value .

:templateArgument
    a rdf:Property ;
    rdfs:label "template argument" ;
    rdfs:comment "Connects a template instantiation to one of its supplied arguments." ;
    rdfs:domain :TemplateInstantiation ;
    rdfs:range :TemplateArgument .

:argumentParameter
    a rdf:Property ;
    rdfs:label "argument parameter" ;
    rdfs:comment "Connects a template argument to the parameter it satisfies." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range :TemplateParameter .

:argumentType
    a rdf:Property ;
    rdfs:label "argument type" ;
    rdfs:comment "The type supplied by a template argument." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range :Type .

:argumentValue
    a rdf:Property ;
    rdfs:label "argument value" ;
    rdfs:comment "The value supplied by a template argument." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range :Value .

:argumentExpression
    a rdf:Property ;
    rdfs:label "argument expression" ;
    rdfs:comment "The raw type-system entity supplied as a template argument." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range :Entity .

:argumentConformance
    a rdf:Property ;
    rdfs:label "argument conformance" ;
    rdfs:comment "A type relation proving that a supplied template argument satisfies its parameter." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range :TypeRelation .

:parameterDefaultConformance
    a rdf:Property ;
    rdfs:label "parameter default conformance" ;
    rdfs:comment "A type relation proving that a template parameter default satisfies its constraint." ;
    rdfs:domain :TemplateParameter ;
    rdfs:range :TypeRelation .

:instantiates
    a rdf:Property ;
    rdfs:label "instantiates" ;
    rdfs:comment "Connects a template instantiation to the generic entity being instantiated." ;
    rdfs:domain :TemplateInstantiation ;
    rdfs:range :Entity .

:resultingType
    a rdf:Property ;
    rdfs:label "resulting type" ;
    rdfs:comment "The type produced by a template instantiation." ;
    rdfs:domain :TemplateInstantiation ;
    rdfs:range :Type .

:valueOfBaseType
    a rdf:Property ;
    rdfs:label "value-of base type" ;
    rdfs:comment "The base type whose values satisfy a value-of type expression." ;
    rdfs:domain :ValueOfType ;
    rdfs:range :Type .

:typeOfValue
    a rdf:Property ;
    rdfs:label "type-of value" ;
    rdfs:comment "The value whose declared or inferred type is projected by a type-of expression." ;
    rdfs:domain :TypeOfValue ;
    rdfs:range :Value .

:typeOfResultType
    a rdf:Property ;
    rdfs:label "type-of result type" ;
    rdfs:comment "The resolved result type of a type-of expression." ;
    rdfs:domain :TypeOfValue ;
    rdfs:range :Type .

:hasInitializer
    a rdf:Property ;
    rdfs:label "has initializer" ;
    rdfs:comment "Connects a scalar type to an initializer that can produce values for it." ;
    rdfs:domain :Scalar ;
    rdfs:range :ScalarInitializer .

:initializerParameter
    a rdf:Property ;
    rdfs:label "initializer parameter" ;
    rdfs:comment "Connects a scalar initializer to one of its parameter slots." ;
    rdfs:domain :ScalarInitializer ;
    rdfs:range :ParameterSlot .

:initializerResult
    a rdf:Property ;
    rdfs:label "initializer result" ;
    rdfs:comment "Connects a scalar initializer to the scalar type it produces." ;
    rdfs:domain :ScalarInitializer ;
    rdfs:range :Scalar .

:initializerSemanticKind
    a rdf:Property ;
    rdfs:label "initializer semantic kind" ;
    rdfs:comment "Connects a scalar initializer to its semantic category." ;
    rdfs:domain :ScalarInitializer ;
    rdfs:range :ScalarInitializerSemanticKind .

:invokesInitializer
    a rdf:Property ;
    rdfs:label "invokes initializer" ;
    rdfs:comment "Connects an initializer-call value to the scalar initializer it invokes." ;
    rdfs:domain :ScalarInitializerCall ;
    rdfs:range :ScalarInitializer .

:hasInitializerArgument
    a rdf:Property ;
    rdfs:label "has initializer argument" ;
    rdfs:comment "Connects an initializer-call value to one of its supplied arguments." ;
    rdfs:domain :ScalarInitializerCall ;
    rdfs:range :InitializerArgument .

:initializerArgumentFor
    a rdf:Property ;
    rdfs:label "initializer argument for" ;
    rdfs:comment "Connects an initializer argument to the parameter slot it satisfies." ;
    rdfs:domain :InitializerArgument ;
    rdfs:range :ParameterSlot .

:initializerArgumentValue
    a rdf:Property ;
    rdfs:label "initializer argument value" ;
    rdfs:comment "The value supplied for an initializer argument." ;
    rdfs:domain :InitializerArgument ;
    rdfs:range :Value .

:objectMember
    a rdf:Property ;
    rdfs:label "object member" ;
    rdfs:comment "Connects an object value to one of its members." ;
    rdfs:domain :ObjectValue ;
    rdfs:range :ObjectValueMember .

:memberValue
    a rdf:Property ;
    rdfs:label "member value" ;
    rdfs:comment "The value carried by an object member." ;
    rdfs:domain :ObjectValueMember ;
    rdfs:range :Value .

:arrayItem
    a rdf:Property ;
    rdfs:label "array item" ;
    rdfs:comment "Connects an array value to one of its ordered items." ;
    rdfs:domain :ArrayValue ;
    rdfs:range :ArrayValueItem .

:itemValue
    a rdf:Property ;
    rdfs:label "item value" ;
    rdfs:comment "The value carried by an array item." ;
    rdfs:domain :ArrayValueItem ;
    rdfs:range :Value .

:matchSourceField
    a rdf:Property ;
    rdfs:label "match source field" ;
    rdfs:comment "The source field in a field match." ;
    rdfs:domain :FieldMatch ;
    rdfs:range :Field .

:matchTargetField
    a rdf:Property ;
    rdfs:label "match target field" ;
    rdfs:comment "The target field in a field match." ;
    rdfs:domain :FieldMatch ;
    rdfs:range :Field .

:fieldMatchRelation
    a rdf:Property ;
    rdfs:label "field match relation" ;
    rdfs:comment "The field-level type relation proven by a field match." ;
    rdfs:domain :FieldMatch ;
    rdfs:range :TypeRelation .

:matchSourceAlternative
    a rdf:Property ;
    rdfs:label "match source alternative" ;
    rdfs:comment "The source union alternative in an alternative match." ;
    rdfs:domain :AlternativeMatch ;
    rdfs:range :UnionAlternative .

:matchTargetAlternative
    a rdf:Property ;
    rdfs:label "match target alternative" ;
    rdfs:comment "The target union alternative in an alternative match." ;
    rdfs:domain :AlternativeMatch ;
    rdfs:range :UnionAlternative .

:alternativeMatchRelation
    a rdf:Property ;
    rdfs:label "alternative match relation" ;
    rdfs:comment "The type relation proven by an alternative match." ;
    rdfs:domain :AlternativeMatch ;
    rdfs:range :TypeRelation .

:matchSourceTupleElement
    a rdf:Property ;
    rdfs:label "match source tuple element" ;
    rdfs:comment "The source tuple element in a tuple element match." ;
    rdfs:domain :TupleElementMatch ;
    rdfs:range :TupleElement .

:matchTargetTupleElement
    a rdf:Property ;
    rdfs:label "match target tuple element" ;
    rdfs:comment "The target tuple element in a tuple element match." ;
    rdfs:domain :TupleElementMatch ;
    rdfs:range :TupleElement .

:tupleElementMatchRelation
    a rdf:Property ;
    rdfs:label "tuple element match relation" ;
    rdfs:comment "The element-level type relation proven by a tuple element match." ;
    rdfs:domain :TupleElementMatch ;
    rdfs:range :TypeRelation .

:matchSourceElementType
    a rdf:Property ;
    rdfs:label "match source element type" ;
    rdfs:comment "The source collection element type in a collection match." ;
    rdfs:domain :CollectionElementTypeMatch ;
    rdfs:range :Type .

:matchTargetElementType
    a rdf:Property ;
    rdfs:label "match target element type" ;
    rdfs:comment "The target collection element type in a collection match." ;
    rdfs:domain :CollectionElementTypeMatch ;
    rdfs:range :Type .

:collectionElementMatchRelation
    a rdf:Property ;
    rdfs:label "collection element match relation" ;
    rdfs:comment "The element-level type relation proven by a collection element type match." ;
    rdfs:domain :CollectionElementTypeMatch ;
    rdfs:range :TypeRelation .

################################################################################
# Datatype properties
################################################################################

:keyText
    a rdf:Property ;
    rdfs:label "key text" ;
    rdfs:comment "The textual key of a field key." ;
    rdfs:domain :FieldKey ;
    rdfs:range xsd:string .

:lexicalValue
    a rdf:Property ;
    rdfs:label "lexical value" ;
    rdfs:comment "The normalized lexical value represented by a literal or scalar value." ;
    rdfs:domain :Entity ;
    rdfs:range xsd:string .

:memberName
    a rdf:Property ;
    rdfs:label "member name" ;
    rdfs:comment "The local name of an enum member or union variant." ;
    rdfs:domain :Entity ;
    rdfs:range xsd:string .

:literalValue
    a rdf:Property ;
    rdfs:label "literal value" ;
    rdfs:comment "The literal value represented by a literal type. This property intentionally has no fixed datatype range because literal types can represent string, numeric, boolean, null, or domain-specific literal values." ;
    rdfs:domain :LiteralType .

:stringValue
    a rdf:Property ;
    rdfs:label "string value" ;
    rdfs:comment "A concrete string value." ;
    rdfs:domain :Entity ;
    rdfs:range xsd:string .

:numericValue
    a rdf:Property ;
    rdfs:label "numeric value" ;
    rdfs:comment "A concrete numeric value." ;
    rdfs:domain :Entity ;
    rdfs:range xsd:decimal .

:booleanValue
    a rdf:Property ;
    rdfs:label "boolean value" ;
    rdfs:comment "A concrete boolean value." ;
    rdfs:domain :Entity ;
    rdfs:range xsd:boolean .

:isIntegralNumericValue
    a rdf:Property ;
    rdfs:label "is integral numeric value" ;
    rdfs:comment "Whether a numeric literal value is integral." ;
    rdfs:domain :NumericLiteralType ;
    rdfs:range xsd:boolean .

:ordinal
    a rdf:Property ;
    rdfs:label "ordinal" ;
    rdfs:comment "A zero-based structural ordering number for a slot, alternative, member, or argument." ;
    rdfs:domain :Entity ;
    rdfs:range xsd:integer .

:minCount
    a rdf:Property ;
    rdfs:label "minimum count" ;
    rdfs:comment "The minimum number of values accepted by a typed slot." ;
    rdfs:domain :TypedSlot ;
    rdfs:range xsd:integer .

:maxCount
    a rdf:Property ;
    rdfs:label "maximum count" ;
    rdfs:comment "The maximum number of values accepted by a typed slot." ;
    rdfs:domain :TypedSlot ;
    rdfs:range xsd:integer .

:isOptional
    a rdf:Property ;
    rdfs:label "is optional" ;
    rdfs:comment "Whether a typed slot can be omitted." ;
    rdfs:domain :TypedSlot ;
    rdfs:range xsd:boolean .

:isVariadic
    a rdf:Property ;
    rdfs:label "is variadic" ;
    rdfs:comment "Whether a typed slot accepts a variable number of values." ;
    rdfs:domain :TypedSlot ;
    rdfs:range xsd:boolean .

:minValue
    a rdf:Property ;
    rdfs:label "minimum value" ;
    rdfs:comment "A numeric lower bound for a type." ;
    rdfs:domain :Type ;
    rdfs:range xsd:decimal .

:maxValue
    a rdf:Property ;
    rdfs:label "maximum value" ;
    rdfs:comment "A numeric upper bound for a type." ;
    rdfs:domain :Type ;
    rdfs:range xsd:decimal .

:numericBitWidth
    a rdf:Property ;
    rdfs:label "numeric bit width" ;
    rdfs:comment "The bit width of a numeric scalar type." ;
    rdfs:domain :NumericType ;
    rdfs:range xsd:integer .

:numericRadix
    a rdf:Property ;
    rdfs:label "numeric radix" ;
    rdfs:comment "The radix used to describe a numeric scalar representation." ;
    rdfs:domain :NumericType ;
    rdfs:range xsd:integer .

:numericPrecisionDigits
    a rdf:Property ;
    rdfs:label "numeric precision digits" ;
    rdfs:comment "The number of significant digits represented by a numeric scalar type." ;
    rdfs:domain :NumericType ;
    rdfs:range xsd:integer .

:numericMinFiniteMagnitude
    a rdf:Property ;
    rdfs:label "numeric minimum finite magnitude" ;
    rdfs:comment "The smallest finite magnitude represented by an approximate numeric type." ;
    rdfs:domain :NumericType ;
    rdfs:range xsd:decimal .

:numericMaxFiniteMagnitude
    a rdf:Property ;
    rdfs:label "numeric maximum finite magnitude" ;
    rdfs:comment "The largest finite magnitude represented by an approximate numeric type." ;
    rdfs:domain :NumericType ;
    rdfs:range xsd:decimal .

:minExponent
    a rdf:Property ;
    rdfs:label "minimum exponent" ;
    rdfs:comment "The minimum exponent accepted by a decimal or floating numeric type." ;
    rdfs:domain :NumericType ;
    rdfs:range xsd:integer .

:maxExponent
    a rdf:Property ;
    rdfs:label "maximum exponent" ;
    rdfs:comment "The maximum exponent accepted by a decimal or floating numeric type." ;
    rdfs:domain :NumericType ;
    rdfs:range xsd:integer .

:minLength
    a rdf:Property ;
    rdfs:label "minimum length" ;
    rdfs:comment "A string length lower bound for a type." ;
    rdfs:domain :Type ;
    rdfs:range xsd:integer .

:maxLength
    a rdf:Property ;
    rdfs:label "maximum length" ;
    rdfs:comment "A string length upper bound for a type." ;
    rdfs:domain :Type ;
    rdfs:range xsd:integer .

:minItems
    a rdf:Property ;
    rdfs:label "minimum items" ;
    rdfs:comment "A collection item-count lower bound for a type." ;
    rdfs:domain :Type ;
    rdfs:range xsd:integer .

:maxItems
    a rdf:Property ;
    rdfs:label "maximum items" ;
    rdfs:comment "A collection item-count upper bound for a type." ;
    rdfs:domain :Type ;
    rdfs:range xsd:integer .

:isExactType
    a rdf:Property ;
    rdfs:label "is exact type" ;
    rdfs:comment "Whether a type has an exact closed shape or value space." ;
    rdfs:domain :Type ;
    rdfs:range xsd:boolean .

:isAnonymous
    a rdf:Property ;
    rdfs:label "is anonymous" ;
    rdfs:comment "Whether a type is anonymous rather than declaration-named." ;
    rdfs:domain :Type ;
    rdfs:range xsd:boolean .

:isBuiltInType
    a rdf:Property ;
    rdfs:label "is built-in type" ;
    rdfs:comment "Whether a type is supplied by the type system." ;
    rdfs:domain :Type ;
    rdfs:range xsd:boolean .

:isUserDefinedType
    a rdf:Property ;
    rdfs:label "is user-defined type" ;
    rdfs:comment "Whether a type is authored outside the built-in type set." ;
    rdfs:domain :Type ;
    rdfs:range xsd:boolean .

:argumentName
    a rdf:Property ;
    rdfs:label "argument name" ;
    rdfs:comment "The supplied name of a named template argument." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range xsd:string .

:isNamedArgument
    a rdf:Property ;
    rdfs:label "is named argument" ;
    rdfs:comment "Whether a template argument was supplied by name." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range xsd:boolean .

:argumentEvaluationOrdinal
    a rdf:Property ;
    rdfs:label "argument evaluation ordinal" ;
    rdfs:comment "The parameter-order position used to evaluate a template argument." ;
    rdfs:domain :TemplateArgument ;
    rdfs:range xsd:integer .

:evidenceRule
    a rdf:Property ;
    rdfs:label "evidence rule" ;
    rdfs:comment "A short rule label for type relation evidence." ;
    rdfs:domain :TypeRelationEvidence ;
    rdfs:range xsd:string .

################################################################################
# Built-in individuals
################################################################################

:unknown
    a :UnknownType, :IntrinsicType ;
    skos:prefLabel "unknown" ;
    :isBuiltInType true .

:any
    a :AnyType, :IntrinsicType ;
    skos:prefLabel "any" ;
    :isBuiltInType true .

:void
    a :VoidType, :IntrinsicType ;
    skos:prefLabel "void" ;
    :isBuiltInType true .

:never
    a :NeverType, :IntrinsicType ;
    skos:prefLabel "never" ;
    :isBuiltInType true .

:null
    a :NullType, :IntrinsicType ;
    skos:prefLabel "null" ;
    :isBuiltInType true .

:stringLiteral
    a :LiteralKind ;
    skos:prefLabel "stringLiteral" .

:numericLiteral
    a :LiteralKind ;
    skos:prefLabel "numericLiteral" .

:booleanLiteral
    a :LiteralKind ;
    skos:prefLabel "booleanLiteral" .

:nullLiteral
    a :LiteralKind ;
    skos:prefLabel "nullLiteral" .

:enumMemberReferenceLiteral
    a :LiteralKind ;
    skos:prefLabel "enumMemberReferenceLiteral" .

:unionVariantReferenceLiteral
    a :LiteralKind ;
    skos:prefLabel "unionVariantReferenceLiteral" .

:identifierFieldKey
    a :FieldKeyKind ;
    skos:prefLabel "identifier" .

:escapedIdentifierFieldKey
    a :FieldKeyKind ;
    skos:prefLabel "escapedIdentifier" .

:stringLiteralFieldKey
    a :FieldKeyKind ;
    skos:prefLabel "stringLiteral" .

:calendarDateTemporalKind
    a :TemporalKind ;
    skos:prefLabel "calendarDate" .

:clockTimeTemporalKind
    a :TemporalKind ;
    skos:prefLabel "clockTime" .

:dateTimeTemporalKind
    a :TemporalKind ;
    skos:prefLabel "dateTime" .

:durationTemporalKind
    a :TemporalKind ;
    skos:prefLabel "duration" .

:noZoneTemporalSemantics
    a :TemporalZoneSemantics ;
    skos:prefLabel "noZone" .

:utcTemporalSemantics
    a :TemporalZoneSemantics ;
    skos:prefLabel "utc" .

:offsetTemporalSemantics
    a :TemporalZoneSemantics ;
    skos:prefLabel "offset" .

:notApplicableTemporalSemantics
    a :TemporalZoneSemantics ;
    skos:prefLabel "notApplicable" .

:envelopeObject
    a :DiscriminatorEnvelope ;
    skos:prefLabel "object" .

:envelopeNone
    a :DiscriminatorEnvelope ;
    skos:prefLabel "none" .

:scalarValueConversionInitializer
    a :ScalarInitializerSemanticKind ;
    skos:prefLabel "valueConversion" .

:isoLexicalParseInitializer
    a :ScalarInitializerSemanticKind ;
    skos:prefLabel "isoLexicalParse" .

:currentTemporalInitializer
    a :ScalarInitializerSemanticKind ;
    skos:prefLabel "currentTemporal" .

:string
    a :StringType, :IntrinsicType ;
    skos:prefLabel "string" ;
    :isBuiltInType true ;
    :standardBaseScalar :string .

:url
    a :UrlType, :IntrinsicType ;
    skos:prefLabel "url" ;
    :isBuiltInType true ;
    :baseScalar :string ;
    :standardBaseScalar :string ;
    :subtypeOf :string .

:bytes
    a :BytesType, :IntrinsicType ;
    skos:prefLabel "bytes" ;
    :isBuiltInType true ;
    :standardBaseScalar :bytes .

:boolean
    a :BooleanType, :IntrinsicType ;
    skos:prefLabel "boolean" ;
    :isBuiltInType true ;
    :standardBaseScalar :boolean .

:numeric
    a :NumericType, :IntrinsicType ;
    skos:prefLabel "numeric" ;
    :isBuiltInType true ;
    :standardBaseScalar :numeric .

:integer
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "integer" ;
    :isBuiltInType true ;
    :standardBaseScalar :integer ;
    :subtypeOf :numeric .

:int8
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "int8" ;
    :isBuiltInType true ;
    :standardBaseScalar :int8 ;
    :subtypeOf :integer ;
    :numericRangeAssignableTo :int16 ;
    :numericBitWidth 8 ;
    :numericRadix 2 ;
    :minValue "-128"^^xsd:decimal ;
    :maxValue "127"^^xsd:decimal .

:int16
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "int16" ;
    :isBuiltInType true ;
    :standardBaseScalar :int16 ;
    :subtypeOf :integer ;
    :numericRangeAssignableTo :int32 ;
    :numericBitWidth 16 ;
    :numericRadix 2 ;
    :minValue "-32768"^^xsd:decimal ;
    :maxValue "32767"^^xsd:decimal .

:int32
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "int32" ;
    :isBuiltInType true ;
    :standardBaseScalar :int32 ;
    :subtypeOf :integer ;
    :numericRangeAssignableTo :safeint ;
    :numericBitWidth 32 ;
    :numericRadix 2 ;
    :minValue "-2147483648"^^xsd:decimal ;
    :maxValue "2147483647"^^xsd:decimal .

:int64
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "int64" ;
    :isBuiltInType true ;
    :standardBaseScalar :int64 ;
    :subtypeOf :integer ;
    :numericBitWidth 64 ;
    :numericRadix 2 ;
    :minValue "-9223372036854775808"^^xsd:decimal ;
    :maxValue "9223372036854775807"^^xsd:decimal .

:safeint
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "safeint" ;
    :isBuiltInType true ;
    :standardBaseScalar :safeint ;
    :subtypeOf :integer ;
    :numericRangeAssignableTo :int64 ;
    :numericBitWidth 53 ;
    :numericRadix 2 ;
    :minValue "-9007199254740991"^^xsd:decimal ;
    :maxValue "9007199254740991"^^xsd:decimal .

:uint8
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "uint8" ;
    :isBuiltInType true ;
    :standardBaseScalar :uint8 ;
    :subtypeOf :integer ;
    :numericRangeAssignableTo :uint16, :int16 ;
    :numericBitWidth 8 ;
    :numericRadix 2 ;
    :minValue "0"^^xsd:decimal ;
    :maxValue "255"^^xsd:decimal .

:uint16
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "uint16" ;
    :isBuiltInType true ;
    :standardBaseScalar :uint16 ;
    :subtypeOf :integer ;
    :numericRangeAssignableTo :uint32, :int32 ;
    :numericBitWidth 16 ;
    :numericRadix 2 ;
    :minValue "0"^^xsd:decimal ;
    :maxValue "65535"^^xsd:decimal .

:uint32
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "uint32" ;
    :isBuiltInType true ;
    :standardBaseScalar :uint32 ;
    :subtypeOf :integer ;
    :numericRangeAssignableTo :uint64, :safeint, :int64 ;
    :numericBitWidth 32 ;
    :numericRadix 2 ;
    :minValue "0"^^xsd:decimal ;
    :maxValue "4294967295"^^xsd:decimal .

:uint64
    a :IntegerType, :IntrinsicType ;
    skos:prefLabel "uint64" ;
    :isBuiltInType true ;
    :standardBaseScalar :uint64 ;
    :subtypeOf :integer ;
    :numericBitWidth 64 ;
    :numericRadix 2 ;
    :minValue "0"^^xsd:decimal ;
    :maxValue "18446744073709551615"^^xsd:decimal .

:float
    a :FloatType, :IntrinsicType ;
    skos:prefLabel "float" ;
    :isBuiltInType true ;
    :standardBaseScalar :float ;
    :subtypeOf :numeric .

:float32
    a :FloatType, :IntrinsicType ;
    skos:prefLabel "float32" ;
    :isBuiltInType true ;
    :standardBaseScalar :float32 ;
    :numericRangeAssignableTo :float64 ;
    :numericBitWidth 32 ;
    :numericRadix 2 ;
    :numericPrecisionDigits 24 ;
    :subtypeOf :numeric .

:float64
    a :FloatType, :IntrinsicType ;
    skos:prefLabel "float64" ;
    :isBuiltInType true ;
    :standardBaseScalar :float64 ;
    :numericBitWidth 64 ;
    :numericRadix 2 ;
    :numericPrecisionDigits 53 ;
    :subtypeOf :numeric .

:decimal
    a :DecimalType, :IntrinsicType ;
    skos:prefLabel "decimal" ;
    :isBuiltInType true ;
    :standardBaseScalar :decimal ;
    :subtypeOf :numeric .

:decimal128
    a :DecimalType, :IntrinsicType ;
    skos:prefLabel "decimal128" ;
    :isBuiltInType true ;
    :standardBaseScalar :decimal128 ;
    :numericRadix 10 ;
    :numericPrecisionDigits 34 ;
    :minExponent -6143 ;
    :maxExponent 6144 ;
    :subtypeOf :decimal .

:plainDate
    a :DateType, :IntrinsicType ;
    skos:prefLabel "plainDate" ;
    :isBuiltInType true ;
    :standardBaseScalar :plainDate ;
    :temporalKind :calendarDateTemporalKind ;
    :temporalZoneSemantics :noZoneTemporalSemantics .

:plainTime
    a :TimeType, :IntrinsicType ;
    skos:prefLabel "plainTime" ;
    :isBuiltInType true ;
    :standardBaseScalar :plainTime ;
    :temporalKind :clockTimeTemporalKind ;
    :temporalZoneSemantics :noZoneTemporalSemantics .

:utcDateTime
    a :DateTimeType, :IntrinsicType ;
    skos:prefLabel "utcDateTime" ;
    :isBuiltInType true ;
    :standardBaseScalar :utcDateTime ;
    :temporalKind :dateTimeTemporalKind ;
    :temporalZoneSemantics :utcTemporalSemantics .

:offsetDateTime
    a :DateTimeType, :IntrinsicType ;
    skos:prefLabel "offsetDateTime" ;
    :isBuiltInType true ;
    :standardBaseScalar :offsetDateTime ;
    :temporalKind :dateTimeTemporalKind ;
    :temporalZoneSemantics :offsetTemporalSemantics .

:duration
    a :DurationType, :IntrinsicType ;
    skos:prefLabel "duration" ;
    :isBuiltInType true ;
    :standardBaseScalar :duration ;
    :temporalKind :durationTemporalKind ;
    :temporalZoneSemantics :notApplicableTemporalSemantics .

:unixTimestamp32
    a :IntegerType, :DateTimeType, :IntrinsicType ;
    skos:prefLabel "unixTimestamp32" ;
    :isBuiltInType true ;
    :baseScalar :int32 ;
    :standardBaseScalar :unixTimestamp32 ;
    :temporalKind :dateTimeTemporalKind ;
    :temporalZoneSemantics :utcTemporalSemantics ;
    :subtypeOf :int32 ;
    :minValue "-2147483648"^^xsd:decimal ;
    :maxValue "2147483647"^^xsd:decimal .
