The tension between the Open World Assumption (OWA) and Closed World Assumption (CWA) represents one of the fundamental philosophical and practical divides in knowledge representation. OWL (Web Ontology Language) embraces OWA, treating absence of information as unknown rather than false. SHACL (Shapes Constraint Language), conversely, validates data under CWA, where what is not explicitly stated is considered false. This article explores how dependent type theory, specifically Agda, can model both approaches and potentially bridge this conceptual gap.

Open World Assumption (OWA)

Under OWA, the world is inherently incomplete. If we cannot prove a statement is true, we cannot conclude it is false — it remains unknown. This assumption aligns with the reality of distributed, evolving knowledge systems where information is constantly being discovered and added.

Example: If we have no statement that “Alice knows Bob,” we cannot conclude Alice does not know Bob. The information is simply absent.

Closed World Assumption (CWA)

Under CWA, what is not known to be true is considered false. This assumption works well for validation, databases, and bounded domains where we have complete information.

Example: If our database has no record of “Alice knows Bob,” we can definitively say this relationship does not exist in our system.

OWL and the Open World

OWL’s reasoning is built on description logic, which operates under OWA. This has profound implications:

:Alice a :Person .

:Bob a :Person .

# Ontology constraint

:Person owl:equivalentClass [

a owl:Restriction ;

owl:onProperty :hasParent ;

owl:minCardinality 2

] .

In this example, even though we haven’t stated Alice’s parents, an OWL reasoner will not conclude Alice violates the constraint. The information about Alice’s parents is simply unknown — she might have parents that haven’t been stated yet.

SHACL and the Closed World

SHACL validates RDF graphs under CWA, making it perfect for data quality checking:

# SHACL Shape

:PersonShape a sh:NodeShape ;

sh:targetClass :Person ;

sh:property [

sh:path :hasParent ;  

sh:minCount 2 ;  

sh:message "A person must have at least 2 parents declared"  

] .

When validating Alice’s data against this shape, SHACL will report a violation because only the stated parents are considered — absence means nonexistence.

Modeling in Agda: Type-Theoretic Foundations

Agda’s dependent types provide a rigorous foundation for modeling both assumptions. The key insight is that OWA corresponds to intuitionistic logic (where absence of proof ≠ proof of absence), while CWA corresponds to classical logic with decidability.

Core Definitions

module WorldAssumptions where

open import Data.Bool using (Bool; true; false)

open import Data.Maybe using (Maybe; just; nothing)

open import Data.Nat using (ℕ; zero; suc; _+_; _≤_)

open import Relation.Nullary using (¬_; Dec; yes; no)

open import Relation.Binary.PropositionalEquality using (_≡_; refl)-- A universe of entities

postulate Entity : Set-- Properties as relations between entities

postulate Property : Entity → Entity → Set

Open World Assumption: OWL-like Agda

In the open world, we model knowledge as what we can prove, not what we can disprove:

module OpenWorld where

open import Data.List using (List; []; _∷_; any)

open import Data.Product using (_×_; ∃; _,_; proj₁; proj₂)

record KnowledgeBase : Set₁ where

field  

  facts : List (∃ λ (subject : Entity) → ∃ λ (object : Entity) → Property subject object)


  

data OWAValue : Set where

known-true  : OWAValue  

known-false : OWAValue  

unknown     : OWAValue


  

query : KnowledgeBase → Entity → Entity → Property → OWAValue

query kb subject object prop =

if any (matches subject object prop) (KnowledgeBase.facts kb)  

then known-true  

else unknown  


  

record OntologyClass : Set₁ where

field  

  name : String  

    

    

  necessaryConditions : Entity → Set  

    

  checkSatisfiable : (e : Entity) → (kb : KnowledgeBase) →   

                    Maybe (necessaryConditions e)


  

Person : OntologyClass

Person = record

{ name = "Person"  

; necessaryConditions = λ e →   

    ∃ λ (p1 : Entity) → ∃ λ (p2 : Entity) →   

      (Property e p1 × Property e p2 × ¬ (p1 ≡ p2))  

; checkSatisfiable = λ e kb →  

      

      

    findParents e kb  

}


  

deriveNewFacts : KnowledgeBase → List Inference → KnowledgeBase

deriveNewFacts kb rules =

applyInferences kb rules


  

data QueryResult : Set where

definitely-true  : QueryResult  

definitely-false : QueryResult    

insufficient-data : QueryResult 


openWorldQuery : KnowledgeBase → Entity → Property → Entity → QueryResult  

openWorldQuery kb subj prop obj =

case lookup kb subj prop obj of  

  found-true  → definitely-true  

  found-false → definitely-false    

  not\-found   → insufficient-data 

Closed World Assumption: SHACL-like Agda

In the closed world, we can definitively determine truth values based on what’s present:

module ClosedWorld where

open import Data.List using (List; []; _∷_; length; filter)

open import Data.Nat using (ℕ; _≤?_)

open import Data.Product using (_×_; ∃; _,_)

open import Relation.Nullary using (Dec; yes; no)

record DataGraph : Set₁ where

field  

  entities : List Entity  

  triples : List (Entity × Property × Entity)  

    

  complete : Bool  


  

data CWAValue : Set where

true  : CWAValue  

false : CWAValue


  

query : DataGraph → Entity → Property → Entity → CWAValue

query dg subject prop object =

if (subject , prop , object) ∈ DataGraph.triples dg  

then true  

else false  


  

record Shape : Set₁ where

field  

  targetClass : Entity → Bool  

    

    

  constraints : List (Entity → DataGraph → Bool)


  

data ValidationResult : Set where

conforms     : ValidationResult  

violates     : List String → ValidationResult  


  

PersonShape : Shape

PersonShape = record

{ targetClass = isPersonClass  

; constraints = hasMinParents 2 ∷ \[\]  

}  

where  

  hasMinParents : ℕ → Entity → DataGraph → Bool  

  hasMinParents n entity dg =   

    let parents = countParents entity dg  

    in n ≤? parents


        countParents : Entity → DataGraph → ℕ  

  countParents entity dg =   

    length (filter (isParentTriple entity) (DataGraph.triples dg))


  

validate : DataGraph → Shape → Entity → ValidationResult

validate dg shape entity =

if all (λ constraint → constraint entity dg) (Shape.constraints shape)  

then conforms  

else violates (collectErrors dg shape entity)


  

isValid : DataGraph → Shape → Entity → Dec (ValidationResult ≡ conforms)

isValid dg shape entity =

case validate dg shape entity of  

  conforms → yes refl  

  violates \_ → no (λ ())

Bridging the Gap: Hybrid Approach

The most powerful approach combines both paradigms:

module HybridWorld where

open OpenWorld using (KnowledgeBase; OWAValue)

open ClosedWorld using (DataGraph; ValidationResult)

record HybridKnowledgeSystem : Set₁ where  

field  

    

  ontology : KnowledgeBase  

  inferenceRules : List InferenceRule


          

  instanceData : DataGraph  

  validationShapes : List Shape


          

  enrichData : DataGraph → KnowledgeBase → DataGraph


  

validateWithReasoning : HybridKnowledgeSystem → Entity → ValidationResult

validateWithReasoning hks entity =

let enrichedData \= HybridKnowledgeSystem.enrichData hks   

                    (HybridKnowledgeSystem.instanceData hks)  

                    (HybridKnowledgeSystem.ontology hks)  

in ClosedWorld.validate enrichedData shape entity  

where  

  shape \= head (HybridKnowledgeSystem.validationShapes hks)


  

inferThenValidate : KnowledgeBase → DataGraph → Shape → Entity → ValidationResult

inferThenValidate onto data shape entity =

let derived \= deriveFromOntology onto data  

  

    complete \= mergeInferred data derived  

  

in ClosedWorld.validate complete shape entity

Practical Example: Family Relationships

Let’s model a concrete example with both approaches:

module FamilyExample where

open import Data.String using (String)

\-- Entities  

postulate

alice bob charlie diana : Entity


\-- Properties  

postulate

hasParent : Property  

hasSibling : Property


\-- OWL-like ontology (OWA)  

familyOntology : OpenWorld.KnowledgeBase

familyOntology = record

{ facts \=   

    (alice , (bob , hasParent)) ∷  

    (alice , (charlie , hasParent)) ∷  

    \[\]  

}


\-- Question: Does Diana have parents?  

queryDiana : OpenWorld.OWAValue

queryDiana = OpenWorld.query familyOntology diana anyEntity hasParent

-- Result: unknown (not false!)

\-- SHACL-like validation (CWA)  

familyData : ClosedWorld.DataGraph

familyData = record

{ entities \= alice ∷ bob ∷ charlie ∷ diana ∷ \[\]  

; triples \=   

    (alice , hasParent , bob) ∷  

    (alice , hasParent , charlie) ∷  

    \[\]  

; complete \= true  

}


personShape : ClosedWorld.Shape  

personShape = record

{ targetClass \= λ \_ → true  

; constraints \= requiresExactlyTwoParents ∷ \[\]  

}


\-- Validation: Does Diana conform?  

validateDiana : ClosedWorld.ValidationResult

validateDiana = ClosedWorld.validate familyData personShape diana

-- Result: violates ["Diana has 0 parents, requires 2"]

\-- Key difference:  

-- - OWA: "We don't know if Diana has parents" (unknown)

-- - CWA: "Diana does NOT have parents" (false/violation)

Advanced: Dependent Types for Schema Evolution

One powerful application of this approach is modeling schema evolution:

module SchemaEvolution where

record EvolvingSchema (version : ℕ) : Set₁ where

field  

  classes : List OntologyClass  

    

  backwardCompatible : (v : ℕ) → v ≤ version →   

                      KnowledgeBase → Maybe ValidationResult


  

record ValidationSnapshot (version : ℕ) : Set₁ where

field  

  frozenSchema : EvolvingSchema version  

  dataAtVersion : DataGraph  

    

  mustConform : ClosedWorld.validate dataAtVersion shapes entities ≡ conforms

Type-Theoretic Insights

OWA as Intuitionistic Logic

The OWA naturally corresponds to intuitionistic/constructive logic, where:

data Proof (P : Set) : Set where

evidence : P → Proof P

-- But absence of proof is not proof of absence

-- ¬ (Proof P) does NOT imply Proof (¬ P)-- In Agda, this is natural:

openWorldNegation : {P : Set} → ¬ (Proof P) → Proof (¬ P)

openWorldNegation absence = {!!} -- Cannot be constructed!

CWA as Classical Logic with LEM

The CWA essentially adds the Law of Excluded Middle:

postulate

closed-world-LEM : (P : Set) → Dec P

-- This allows definitive validation

closedWorldNegation : {P : Set} → ¬ (Proof P) → Proof (¬ P)

closedWorldNegation {P} absence =

case closed-world-LEM P of

yes p → absurd (absence (evidence p))  

no ¬p → evidence ¬p

Modal Logic Perspective

We can also model the distinction using modal operators:

module ModalPerspective where

-- □P = "necessarily P" = proven in ontology (OWA)

-- ◇P = "possibly P" = not contradicted (OWA)

-- P = "actually P" = present in data (CWA)

record ModalKnowledge : Set₁ where  

field  

  necessary : Entity → Property → Entity → Set  -- □  

  possible  : Entity → Property → Entity → Set  -- ◇  

  actual    : Entity → Property → Entity → Bool -- P (decidable)


        -- Modal axioms  

  necessary-implies-actual : ∀ {s p o} → necessary s p o → actual s p o ≡ true  

  actual\-implies-possible  : ∀ {s p o} → actual s p o ≡ true → possible s p o

Practical Implications

When to Use OWA (OWL-like)

  • Integrating data from multiple sources

  • Evolving schemas over time

  • Reasoning with incomplete information

  • Ontology development and knowledge discovery

  • Semantic web and linked data scenarios

When to Use CWA (SHACL-like)

  • Data quality validation

  • Database integrity constraints

  • API response validation

  • Form validation and user input

  • Compliance checking with fixed rules

When to Use Hybrid

  • Validate user input (CWA) against a rich domain model (OWA)

  • Enrich incomplete data with inferred facts before validation

  • Progressive validation: warn vs. error

  • Multi-stage pipelines: reason (OWA) then validate (CWA)

Conclusion

Modeling OWL’s OWA and SHACL’s CWA in Agda reveals the deep logical and type-theoretic foundations of these approaches. OWA corresponds to intuitionistic logic and proof theory, while CWA assumes decidability and classical reasoning. By implementing both in dependent types, we gain:

  • Formal precision: Exact specifications of what each assumption means

  • Composability: Ability to mix both approaches as needed

  • Correctness: Type-checked guarantees about reasoning soundness

  • Clarity: Explicit about what we know vs. what we assume

The future of knowledge representation may lie not in choosing one assumption over the other, but in understanding when each applies and how to bridge between them. Dependent type theory provides the rigorous foundation to make this bridge formal, safe, and practical.

To read more :

https://leanpub.com/dependenttypesdttlogicholforaiagentreadyknowledgegraphs