@prefix : <https://ontology.inferal.com/modules/confidence/> .
@prefix dcls: <https://ontology.inferal.com/modules/data-classification/> .
@prefix ex: <https://example.com/confidence/> .
@prefix pd: <https://w3id.org/dpv/pd#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix ss: <https://ontology.inferal.com/modules/scoped-statements/> .

# Compatibility pattern: a Data Classification record keeps its legacy scalar
# dcls:confidence while linking to a structured probability-scale assessment.
ex:email-classification
    a dcls:DataClassification ;
    dcls:classifiesElement ex:email-field ;
    dcls:personalDataCategory pd:EmailAddress ;
    dcls:confidence 0.98 ;
    dcls:confidenceAssessment ex:email-classification-confidence .

ex:email-field
    a dcls:DataElement ;
    dcls:path "$.customer.email" .

ex:email-classification-confidence
    a :ConfidenceAssessment ;
    :assessmentTarget ex:email-classification ;
    :confidenceValue ex:email-classification-confidence-value .

ex:email-classification-confidence-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.98 .

# Statement-target pattern: use scoped statements when confidence is about an
# exact RDF claim rather than the classification resource as a whole.
ex:email-category-claim
    a ss:QuadTarget ;
    ss:subjectTerm ex:email-classification ;
    ss:predicateTerm dcls:personalDataCategory ;
    ss:objectResourceTerm pd:EmailAddress .

ex:email-category-claim-confidence
    a :ConfidenceAssessment ;
    :assessmentTarget ex:email-category-claim ;
    :confidenceValue ex:email-category-claim-confidence-value .

ex:email-category-claim-confidence-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.98 .

# Probability composition pattern: a PROV activity derives a confidence value
# with product conjunction and records the required independence assumption.
ex:name-confidence
    a :ConfidenceAssessment ;
    :assessmentTarget ex:name-evidence ;
    :confidenceValue ex:name-probability-value .

ex:name-probability-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.82 .

ex:email-confidence
    a :ConfidenceAssessment ;
    :assessmentTarget ex:email-evidence ;
    :confidenceValue ex:email-probability-value .

ex:email-probability-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.90 .

ex:derive-contact-confidence
    a prov:Activity, :ConfidenceComposition ;
    prov:used ex:name-confidence, ex:email-confidence ;
    prov:wasAssociatedWith ex:classification-engine ;
    prov:generated ex:contact-confidence ;
    :usedOperator :ProductConjunction ;
    :recordedAssumption :IndependenceAssumption .

ex:contact-confidence
    a :ConfidenceAssessment ;
    prov:wasGeneratedBy ex:derive-contact-confidence ;
    prov:wasDerivedFrom ex:name-confidence, ex:email-confidence ;
    :assessmentTarget ex:contact-derived-claim ;
    :confidenceValue ex:contact-probability-value .

ex:contact-probability-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.738 .

# Fuzzy composition pattern: the same input scores compose differently because
# fuzzy conjunction uses the minimum operator rather than probability product.
ex:fuzzy-a-confidence
    a :ConfidenceAssessment ;
    :confidenceValue ex:fuzzy-a-value .

ex:fuzzy-a-value
    a :FuzzyMembershipValue ;
    :scale :FuzzyMembershipScale ;
    :score 0.82 .

ex:fuzzy-b-confidence
    a :ConfidenceAssessment ;
    :confidenceValue ex:fuzzy-b-value .

ex:fuzzy-b-value
    a :FuzzyMembershipValue ;
    :scale :FuzzyMembershipScale ;
    :score 0.90 .

ex:derive-fuzzy-confidence
    a prov:Activity, :ConfidenceComposition ;
    prov:used ex:fuzzy-a-confidence, ex:fuzzy-b-confidence ;
    prov:generated ex:fuzzy-output-confidence ;
    :usedOperator :MinimumConjunction .

ex:fuzzy-output-confidence
    a :ConfidenceAssessment ;
    prov:wasGeneratedBy ex:derive-fuzzy-confidence ;
    prov:wasDerivedFrom ex:fuzzy-a-confidence, ex:fuzzy-b-confidence ;
    :confidenceValue ex:fuzzy-output-value .

ex:fuzzy-output-value
    a :FuzzyMembershipValue ;
    :scale :FuzzyMembershipScale ;
    :score 0.82 .

# Subjective-logic pattern: uncertainty is carried as first-class value
# components, while conf:score is only the projected probability.
ex:subjective-output-confidence
    a :ConfidenceAssessment ;
    :confidenceValue ex:subjective-output-value .

ex:subjective-output-value
    a :SubjectiveLogicValue ;
    :scale :SubjectiveLogicScale ;
    :belief 0.648 ;
    :disbelief 0.145 ;
    :uncertainty 0.207 ;
    :baseRate 0.25 ;
    :score 0.69975 .

# Dempster-Shafer pattern: fuse distinct evidence sources about the same
# proposition. The operator is selected with conf:usedOperator, while PROV
# records the input and generated confidence assessments. The fused score is
# derivable: for binary-frame simple-support masses m1 = 0.64 and m2 = 0.68
# on the same proposition there is no conflict, so Dempster's rule yields
# 1 - (1 - 0.64) * (1 - 0.68) = 0.8848.
ex:source-one-evidence-confidence
    a :ConfidenceAssessment ;
    :confidenceValue ex:source-one-dempster-value .

ex:source-one-dempster-value
    a :DempsterShaferValue ;
    :scale :DempsterShaferScale ;
    :score 0.64 .

ex:source-two-evidence-confidence
    a :ConfidenceAssessment ;
    :confidenceValue ex:source-two-dempster-value .

ex:source-two-dempster-value
    a :DempsterShaferValue ;
    :scale :DempsterShaferScale ;
    :score 0.68 .

ex:derive-dempster-confidence
    a prov:Activity, :ConfidenceComposition ;
    prov:used ex:source-one-evidence-confidence, ex:source-two-evidence-confidence ;
    prov:generated ex:fused-evidence-confidence ;
    :usedOperator :DempsterCombination ;
    :recordedAssumption :DistinctEvidenceSourceAssumption .

ex:fused-evidence-confidence
    a :ConfidenceAssessment ;
    prov:wasGeneratedBy ex:derive-dempster-confidence ;
    prov:wasDerivedFrom ex:source-one-evidence-confidence, ex:source-two-evidence-confidence ;
    :confidenceValue ex:fused-dempster-value .

ex:fused-dempster-value
    a :DempsterShaferValue ;
    :scale :DempsterShaferScale ;
    :score 0.8848 .

# Scale-conversion activity pattern: the reusable conversion rule is separate
# from the PROV activity that applies it to a concrete assessment.
ex:project-subjective-confidence
    a prov:Activity, :ScaleConversion ;
    prov:used ex:subjective-output-confidence ;
    prov:generated ex:projected-probability-confidence ;
    :appliedConversionRule :ProbabilityProjection .

ex:projected-probability-confidence
    a :ConfidenceAssessment ;
    prov:wasGeneratedBy ex:project-subjective-confidence ;
    prov:wasDerivedFrom ex:subjective-output-confidence ;
    :confidenceValue ex:projected-probability-value .

ex:projected-probability-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.69975 .

# Bayesian update pattern: the operator declares one minimum input (the
# prior); the likelihood is not a confidence assessment, so the activity
# links it with conf:evidenceModel for audit alongside the recorded
# calibrated-evidence-model assumption.
ex:prior-spam-confidence
    a :ConfidenceAssessment ;
    :assessmentTarget ex:spam-claim ;
    :confidenceValue ex:prior-spam-value .

ex:prior-spam-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.20 .

ex:spam-likelihood-model
    a prov:Entity ;
    prov:wasAttributedTo ex:classification-engine .

ex:update-spam-confidence
    a prov:Activity, :ConfidenceComposition ;
    prov:used ex:prior-spam-confidence ;
    prov:generated ex:posterior-spam-confidence ;
    :usedOperator :BayesianUpdate ;
    :evidenceModel ex:spam-likelihood-model ;
    :recordedAssumption :CalibratedEvidenceModelAssumption .

ex:posterior-spam-confidence
    a :ConfidenceAssessment ;
    prov:wasGeneratedBy ex:update-spam-confidence ;
    prov:wasDerivedFrom ex:prior-spam-confidence ;
    :assessmentTarget ex:spam-claim ;
    :confidenceValue ex:posterior-spam-value .

ex:posterior-spam-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.74 .

# Unary negation pattern: probability complement declares conf:minimumInputs 1,
# so a single-input composition validates.
ex:negate-spam-confidence
    a prov:Activity, :ConfidenceComposition ;
    prov:used ex:posterior-spam-confidence ;
    prov:generated ex:not-spam-confidence ;
    :usedOperator :ProbabilityComplement .

ex:not-spam-confidence
    a :ConfidenceAssessment ;
    prov:wasGeneratedBy ex:negate-spam-confidence ;
    prov:wasDerivedFrom ex:posterior-spam-confidence ;
    :confidenceValue ex:not-spam-value .

ex:not-spam-value
    a :ProbabilityValue ;
    :scale :ProbabilityScale ;
    :score 0.26 .

# Scale specialization pattern: a profile-defined sub-scale declares
# conf:specializes so its values satisfy the built-in value shapes without
# overriding them.
ex:calibrated-detector-scale
    a :ConfidenceScale ;
    :specializes :ProbabilityScale ;
    :composable true .

ex:detector-confidence
    a :ConfidenceAssessment ;
    :confidenceValue ex:detector-confidence-value .

ex:detector-confidence-value
    a :ProbabilityValue ;
    :scale ex:calibrated-detector-scale ;
    :score 0.91 .

# Ordinal pattern: high/medium/low ranks are review tokens, not numbers to
# compose unless a calibration conversion is explicitly recorded.
ex:manual-review-confidence
    a :ConfidenceAssessment ;
    :assessmentTarget ex:manual-review-claim ;
    :confidenceValue ex:manual-review-confidence-value .

ex:manual-review-confidence-value
    a :OrdinalValue ;
    :scale :OrdinalScale ;
    :ordinalRank :HighConfidence .

ex:classification-engine
    a prov:SoftwareAgent .
