package KR { // some forward declarations class IntRange; // by representing numbers as strings, we can apply default values // to them, which is convenient until we upgrade HUTN to handle // default values on numbers typedef string Number; // now to begin for real abstract class KRElt { reference creator to creator of Creates; }; abstract class OntologyElt : KRElt { }; abstract class Term: OntologyElt { reference binding to binding of NameBinds; reference mutex1 to mutex1 of Mutex; reference mutex2 to mutex2 of Mutex; reference comp1 to comp1 of Complement; reference comp2 to comp2 of Complement; reference members to members of HasMember; reference member to member of HasMember; reference whole to whole of WholePart; reference part to part of WholePart; reference combined to combined of CombinedSubstance; reference substance to substance of CombinedSubstance; }; association Mutex { end set [0..*] of Term mutex1; end set [0..*] of Term mutex2; }; association Complement { end set [0..*] of Term comp1; end set [0..*] of Term comp2; }; association HasMember { end single Term members; end set [0..*] of Term member; }; association WholePart { end single Term whole; end set [0..*] of Term part; }; association CombinedSubstance { end single Term combined; end set [0..*] of Term substance; }; abstract class Type : Term { reference supertype to supertype of Generalises; reference subtype to subtype of Generalises; reference instance to instance of IsOfType; }; association Generalises { end set [0..*] of Type supertype; end set [0..*] of Type subtype; }; class ConceptType : Type { reference role1 to relnsig of Role1Type; reference role2 to relnsig of Role2Type; }; class RelnType: Type { }; class RelnSig: RelnType { attribute Number lower1; attribute Number upper1; attribute Number lower2; attribute Number upper2; reference type1 to concept1type of Role1Type; reference type2 to concept2type of Role2Type; }; association Role1Type { end set [0..*] of RelnSig relnsig; end single ConceptType concept1type; }; association Role2Type { end set [0..*] of RelnSig relnsig; end single ConceptType concept2type; }; abstract class Instance : Term { reference type to type of IsOfType; }; association IsOfType { end set [0..*] of Type type; end set [0..*] of Instance instance; }; class ConceptInstance: Instance { }; class NameSpace: Term { reference my_binding to binding of AssignsName; }; class User: NameSpace { reference elt to elt of Creates; }; class Alias : Term { // not really sure what this is for }; class Undefined : Term { }; class Partition: OntologyElt { }; abstract class Value: OntologyElt { }; class IntValue: Value { attribute Number v1; }; class IntRange: IntValue { attribute Number v2; }; class StringValue: Value { attribute string s1; }; class StringRange: StringValue { attribute string s2; }; class Name: StringValue { reference binding to binding of NameIs; }; // orginally Date was a struct but it broke HUTN class Date { attribute Number year; attribute Number month; attribute Number day; attribute Number hour; attribute Number minute; attribute Number second; attribute boolean absolute; }; class DateValue: Value { attribute Date d1; }; class DateRange: DateValue { attribute Date d2; }; class TermValue: Value { reference term to term of TermRef; }; association Creates { end single User creator; end set [0..*] of KRElt elt; }; // I would like a ternary assocation (NameSpace, Name, KRElt) // so I need to create an intermediate class class NameBinding { reference namespace to namespace of AssignsName; reference name to name of NameIs; reference named to named of NameBinds; }; association AssignsName { composite end single NameSpace namespace; end ordered set [0..*] of NameBinding binding; }; association NameIs { end set [0..*] of NameBinding binding; end single Name name; }; association NameBinds { end set [0..*] of NameBinding binding; end single Term named; }; association TermRef { end single TermValue termvalue; end single Term term; }; enum QuantifierKind { a_an, the, few, some, majority, most, all, atmost, atleast, exactly, about }; class Quantifier { attribute QuantifierKind kind; // should use Value below but this HUTNs better attribute string num; attribute string to_num; attribute boolean percent; }; typedef string Qualifier; // "good", "bad", ... typedef string Modality; // "must", "may" ... class Node: ConceptInstance { attribute boolean negate; attribute string text; attribute Quantifier quantifier; attribute Qualifier qualifier; reference src_of to src_of of IsSrcOf; reference dest_of to dest_of of IsDestOf; reference collection to members of HasMember; reference is_subject to is_subject of HasSubject; }; class RelnInstance : Instance { attribute boolean converse; attribute Modality modality; reference src to src of IsSrcOf; reference dest to dest of IsDestOf; }; association IsSrcOf { composite end single Node src; end set [0..*] of RelnInstance src_of; }; association IsDestOf { end single Node dest; composite end single RelnInstance dest_of; }; // could use enums for the items below typedef string CollectionKind; // "set", "bag", "list" etc typedef string Aggregator; // "and", "or", "xor" typedef string Distributes; // "yes", "no", "cumulative", ... class CollectionNode : Node { attribute CollectionKind kind; attribute Aggregator agg; attribute Distributes dist; reference node_member to member of HasMember; }; abstract class Stmt : Node { reference subject to subject of HasSubject; }; association HasSubject { composite end single Stmt is_subject; end single Node subject; }; class Assertion : Stmt { // this is where we say stuff reference conflict to conflict of Conflicts; reference superseded_by to correction of BeforeCorrection; reference supersedes to correction of AfterCorrection; }; class KRQuery : Stmt { // this is where we ask about what we've said }; typedef string Parameter; typedef string Condition; // "necessary", "sufficient", "both" class Defn : Stmt { attribute ordered set [0..*] of Parameter formal; attribute Condition cond; }; class DefnNode : Node { // a DefnNode is only allowed to be used by Defn attribute list [0..*] of Parameter formal; }; // how to record that two or more assertions are in conflict typedef string ConflictKind; class Conflict : KRElt { attribute ConflictKind kind; reference conflicting to conflicting of Conflicts; reference correction to correction of Fixes; }; association Conflicts { end single Conflict conflict; end set [2..*] of Assertion conflicting; }; // how to fix incorrect assertions typedef string CorrectionKind; class Correction : KRElt { attribute CorrectionKind kind; reference before to before of BeforeCorrection; reference after to after of AfterCorrection; reference fixes to conflict of Fixes; }; association BeforeCorrection { end single Correction correction; end set [1..*] of Assertion before; }; association AfterCorrection { end single Correction correction; end set [0..*] of Assertion after; }; association Fixes { end set [0..*] of Correction correction; end set [0..*] of Conflict conflict; }; // specialised assertions can elaborate more general assertions typedef string ElaborationKind; // "example", "counterexample" ... class Elaboration : KRElt { attribute ElaborationKind kind; reference general to general of HasGeneralisation; reference special to special of HasSpecialisation; }; association HasGeneralisation { end single Elaboration elaboration; end set [1..*] of Assertion general; }; association HasSpecialisation { end single Elaboration elaboration; end set [1..*] of Assertion special; }; // we could define Example as a specialisation of Elaboration // but I don't think we gain much from doing so // if the ontology could have abstract/concrete types // then an Example would only have instances of concrete types };