//Additions by Ph. Martin are prefixed by "//pm: ". //All associations now use normalised names (this is a big help to me). //All boolean attributes begin by "is". //The Intercap style is always used. //I don't know when using the keyword "composite" is appropriate or not. package KR { //----------------------- Forward declarations ------------------------- class IntRange; class Date; // 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; typedef string Natural; //positive (or null) integer //------------------------------ KRelt --------------------------------- abstract class KRElt { }; abstract class EltWithCreator { attribute string comment; //comment stored with the object attribute Date creationDate; reference creator to creator of HasCreator; }; //direct subclasses: Term, Partition, Node and Correction abstract class EltWithoutCreator : KRElt { }; //direct subclasses: Collection, Value, NameSpace, Quantifier // and ConflictResolution //A node is not a term (named category), it is a structure //aggregating a term, a quantifier (implicit/null if the term //is an individual) and other stuff. //Similarly, values and name spaces are not terms; they won't //be related by links (e.g. partOf links) like terms arewill. association HasCreator { //pm: was called HasCreatedElts end set [0..*] of EltWithCreator creatorOf; end single User creator; }; //------------------------ Term (named category) ----------------------- //pm: abstract class OntologyElt : KRElt { //pm: }; //removed since no difference between Term and OntologyElt abstract class Term: EltWithCreator { #ifdef KerryNameBinding reference nameBinding to nameBinding of HasNameBinding; #else reference identifier to identifier of HasIdentifier; reference name to name of HasName; #endif reference type to instanceOf of HasInstance; //2 classic symmetric "links" (2nd-order relations): reference exclusion to exclusion of HasExclusion; reference complement to complement of HasComplement; //The following 6 kinds of "links" are only for convenience //and because lexical ontologies such as WordNet use them //(with unclear semantics). Here, we consider them as shorcuts //for statements using concept nodes and relation nodes, //as in the following example: "AirPlane part Wing" and //"Wing partOf AirPlane" are equivalent to the statement //"most Airplane have for part a Wing". reference member to member of HasMember; reference memberOf to memberOf of HasMember; reference part to part of HasPart; reference partOf to partOf of HasPart; reference substance to substance of HasSubstance; reference substanceOf to substanceOf of HasSubstance; reference object to object of HasObject; reference objectOf to objectOf of HasObject; reference location to location of HasLocation; reference locationOf to locationOf of HasLocation; reference url to url of HasUrl; reference urlOf to urlOf of HasUrl; //to refer to nodes (and hence statements) using this term //without quantifier; if "this" is a type, the node is either //connected to a second-order relation or is an embedding node reference directTNode to termOf of HasConceptNodeTerm; //to refer to user that are represented by this term reference representationOf to representationOf of HasRepresentation; }; class Individual: Term { //or type0: term that cannot have instances, }; // subtypes or supertypes abstract class Type : Term { reference instance to instance of HasInstance; reference subtype to subtype of HasSubtype; reference supertype to subtypeOf of HasSubtype; reference subtypePartition to subtypePartitionEltOf of HasSubtypePartitionElt; reference partPartition to partPartitionEltOf of HasPartPartitionElt; reference domainOf to domainOf of HasDomain; //default: any reference rangeOf to rangeOf of HasRange; //default: any //to refer to concept nodes and relations using this type reference directQNode to typeOf of HasConceptNodeType; reference relation to typeOf of HasRelationType; }; class MetaType : Type { //pm: not used below but Type is abstract }; class ConceptType : Type { //pm: not used below but Type is abstract }; class RelationType : Type { //pm: We may want to accept non binary relations even though we also want //pm: to discourage their use. With the following, relations are only binary. attribute Natural minDomain; attribute Natural maxDomain; //if =1, this is a function type? attribute Natural minRange; //always 0 (optional to use)! attribute Natural maxRange; reference domain to domain of HasDomain; reference range to range of HasRange; reference reverse to reverse of HasReverse; }; //pm: class Alias : Term { //Term that is the destination of an '=' link //pm: }; //Can probably be removed (it is an implementation issue). //pm: class Undefined : Term { //temporary and not mandatory since Term //pm: }; //can be used instead //...... A few links between categories (2nd-order relations) //pm: can creators be associated to links when represented this way? association HasDomain { //for the signature of binary relation end single RelationType domainOf; end single Type domain; }; association HasRange { //for the signature of binary relation end single RelationType rangeOf; end single Type range; }; association HasInstance { //the most common link; transitive end set [0..*] of Type instanceOf; end set [0..*] of Term instance; }; association HasSubtype { //the second most common link; transitive end set [0..*] of Type subtypeOf; end set [0..*] of Type subtype; }; association HasExclusion { //the third most common link; symmetric end set [0..*] of Term exclusionOf; end set [0..*] of Term exclusion; }; association HasComplement { //symmetric end set [0..*] of Term complementOf; end set [0..*] of Term complement; }; association HasReverse { //symmetric end set [0..*] of Term reverseOf; end set [0..*] of Term reverse; }; //some shortcut links often used in lexical ontologies association HasMember { end set [0..*] of Term memberOf; //pm: not single end set [0..*] of Term member; }; association HasPart { end set [0..*] of Term partOf; //pm: not single end set [0..*] of Term part; }; association HasSubstance { end set [0..*] of Term substanceOf; //pm: not single end set [0..*] of Term substance; }; association HasObject { //process object or domain object end set [0..*] of Term objectOf; end set [0..*] of Term object; }; association HasLocation { //place, region, ... end set [0..*] of Term locationOf; end set [0..*] of Term location; }; association HasURL { end set [0..*] of Term urlOf; end set [0..*] of Term url; }; //--------------------------- Partition -------------------------------- //a partition is a set of exclusive types or statements abstract class Partition : EltWithCreator { attribute boolean isClosed; //if not, it is redundant since //its elements can be automatically found }; abstract class TypePartition : Partition { }; class SubtypePartition : TypePartition { reference type to type of HasSubtypePartitionElt; }; class PartPartition : TypePartition { reference type to type of HasPartPartitionElt; }; association HasSubtypePartitionElt { end set [0..*] of SubtypePartition subtypePartitionEltOf; end set [0..*] of Type type; }; association HasPartPartitionElt { end set [0..*] of PartPartition partPartitionEltOf; end set [0..*] of Type type; }; //----------------------------- Value --------------------------------- abstract class Value: EltWithoutCreator { //it was OntologyElt }; class Time : Value { //originally Time was a struct but it broke HUTN attribute Natural year; attribute Natural month; attribute Natural day; attribute Natural hour; attribute Natural minute; attribute Natural second; attribute boolean isAbsolute; }; class Date : Time { }; class Duration : Time { }; class TimeValue: Value { //pm: not yet used attribute Time t; }; class TimeRange: TimeValue { //pm: not yet used attribute Time t2; }; class IntValue: Value { //pm: not yet used attribute Natural v; }; //pm: class IntRange: IntValue { //pm: not yet used //pm: attribute Natural v2; //pm: }; class StringValue: Value { attribute string s; }; //pm: class StringRange: StringValue { //pm: not yet used //pm: attribute string s2; //pm: }; #if 0 class Variable: StringValue { attribute string sv; }; #else typedef string Variable; #endif //---------------------- User/NameSpace and Name ---------------------- #ifdef KerryNameBinding // Kerry would like a ternary assocation (NameSpace, Name, Term); // she uses the binary association HasNameBinding (previously // called NameBinds) from a term to an object of class NameBinding // which is also associated to objects of class NameSpace and Name // via the associations HasNameSpace and HasBindedName class Name: StringValue { reference binding to binding of HasName; }; class NameSpace: EltWithoutCreator { //pm: not Term attribute string name; attribute string password; //the term representing this namespace is likely to be an URL reference term to representation of HasRepresentation; reference nameBinding to nameBinding of HasNameSpace; }; class User: NameSpace { reference creatorOf to creatorOf of HasCreator; }; association HasRepresentation { end single NameSpace representationOf; end set [0..*] of Term representation; //most likely only 1 }; class NameBinding { reference term to term of HasNameBinding; reference nameSpace to nameSpace of HasNameSpace; reference name to name of HasBindedName; }; association HasNameBinding { end set [0..*] of NameBinding nameBinding; end single Term term; }; association HasNameSpace { end ordered set [0..*] of NameBinding nameBinding; composite end single NameSpace nameSpace; }; association HasBindedName { end set [0..*] of NameBinding nameBinding; end single Name name; }; #else // Philippe is MUCH more comfortable with the binary associations // - HasIdentifier which goes from a term to an identifier, and // - HasName which goes from a term to a name. // Here, names, like identifiers, include a reference to a // name space and to a name. In fact identifiers are names, the // only difference is that two terms may share the same name but // cannot share the same identifier. How is this issue dealt above? class Name: StringValue { reference nameSpace to nameSpace of HasNameSpace; reference nameOf to nameOf of HasName; }; class Identifier: Name { reference identifierOf to identifierOf of HasIdentifier; }; class NameSpace: EltWithoutCreator { //pm: not Term attribute string name; attribute string password; //the term representing this namespace is likely to be an URL reference term to representation of HasRepresentation; reference nameSpaceOf to nameSpaceOf of HasNameSpace; }; class User: NameSpace { reference creatorOf to creatorOf of HasCreator; }; association HasRepresentation { //"has a term representing it" end single NameSpace representationOf; end set [0..*] of Term representation; //most likely only 1 }; association HasName { end set [0..*] of Term nameOf; end set [0..*] of Name name; }; association HasIdentifier { end single Term identifierOf; //uniquely identified term end set [0..*] of identifier; //possibly many identifiers }; association HasNameSpace { end ordered set [0..*] of Name nameSpaceOf; end ordered set [0..*] of NameSpace nameSpace; }; #endif //-------------------------- Collection -------------------------------- //Not a node because a node with a collection may or may not be //quantified, so multi-inheritance would be required. enum CollKind { set, bag, list, sequence }; enum CollAggregation { and, or, xor }; enum CollInterpretation { collective, cumulative }; //default: distrib. class Collection : EltWithoutCreator { attribute CollectionKind kind; attribute boolean isClosedColl; attribute CollAggregation aggregation; attribute CollInterpretation interpretation; //pm: attribute Number size; //number of elems: not all may be given }; class NodeCollection : Collection { reference collOf to collOf of HasCollection; reference collElt to collElt of HasCollectionElt; }; association HasCollection { end single ConceptNode collOf; end set [0..*] of NodeWithCollection coll; }; association HasCollectionElt { end set [0..*] of NodeWithCollection collEltOf; end set [0..*] of ConceptNode collElt; }; //----------------------------- Node ----------------------------------- abstract class Node : EltWithCreator { }; abstract class ConceptNode : Node { reference sourceOf to sourceOf of HasOriginNode; reference destOf to destOf of HasDestNode; reference coll to coll of HasCollection; reference collEltOf to collEltOf of HasCollectionElt; //a class EmbeddedNode could be created for the next 2 lines //but multi-instantiation would be needed to permit instances //of subclasses of Node to be also instance of EmbeddedNode attribute boolean isNegated; reference embeddingNode to embeddedNodeOf of HasEmbeddedNode; //Using variables is one of the ways to //1) connect this node to a definition parameter, //2) specify that this connect is identical to another node. //In both cases, if multi-instantiation is possible, //an association could also be used. attribute Variable var; }; enum Modality { must, may, can }; //default: none class Relation : Node { attribute boolean isReversed; attribute Modality modality; reference type to type of HasRelationType; reference source to source of HasSourceNode; reference dest to dest of HasDestNode; }; association HasRelationType { end set [0..*] of ConceptNode typeOf; composite end single Type type; //not always RelationType }; association HasSourceNode { //pm: I have reversed the order/direction end set [0..*] of Relation sourceOf; //normally 1 composite end single ConceptNode source; }; association HasDestNode { //pm: I have reversed the order/direction composite end single Relation destOf; end single ConceptNode dest; //pm: composite?? }; //.................. VNode (ConceptNodeForValue) ...................... // Concept node with just a value (number or time) or an interval of // value. Nno term, no quantifier. class VNode : ConceptNode { }; class NodeForNumber : VNode { attribute Precision precision; attribute Number number; attribute Number toNumber; }; class NodeForTime : VNode { //point in time or duration attribute Time time; attribute Time toTime; }; //................. QNode (QuantifiedConceptNode) ..................... //precision/approximation: by default "exact" (not specified) enum Precision { about, around, atLeast, atMost, between }; enum QuantificationKind { few, most, several, //default: some any, percent, local_any, local_percent }; class Quantifier : EltWithoutCreator { attribute QuantifierKind kind; attribute Number number; //Number HUTNs better than Value attribute Number toNumber; attribute Precision precision; }; enum Qualifier {small, important,big,great, good,bad}; //default:none class QNode : ConceptNode { reference type to type of HasConceptNodeType; attribute Quantifier quantifier; attribute Qualifier qualifier; }; //a type may also be used without quantifier association HasConceptNodeType { end set [0..*] of Node typeOf; composite end single Type type; }; //................. TNode (ConceptNodeForTerm) .................. //the term may be a type if a second-order relation is connected //or, in the case this node is an embedding node (see below), if a //statement type (e.g. hypothesis or proof) is given instead of an //individual (if neither is given, the statement type is "statement") class TNode : ConceptNode { reference type to type of HasConceptNodeTerm; }; association HasConceptNodeTerm { end set [0..*] of TNode termOf; composite end single Term term; }; //.................... EmbeddingNode (statement) ...................... //an embedding node may or may not be quantified. abstract class EmbeddingNode : TNode { //assertion/defin./query attribute string text; //text used for asserting the node //or application-dependant place of storage reference embeddedNode to embeddedNode of HasEmbeddedNode; reference firstEmbeddedNode to firstEmbeddedNode of HasFirstEmbeddedNode; }; //pm: class EmbeddedNode : ConceptNode { //pm: attribute boolean isNegated; //pm: reference embeddingNode to embeddedNodeOf of HasEmbeddedNode; //pm: }; association HasEmbeddedNode { composite end single EmbeddingNode embeddedNodeOf; end set [0..*] of Node embeddedNode; //Node or EmbeddedNode }; association HasFirstEmbeddedNode { //the first node of the statement composite end single Node embeddedNodeOf; end single EmbeddedNode embeddedNode; //pm: composite?? }; class KRQuery : EmbeddingNode { //to query statements }; class LNode : EmbeddingNode { //a node defining And using a lambda }; //e.g. [most (cat, chrc: a great hapiness)] enum DefKind { NC, SC, NSC }; //necessary and/or sufficient conditions class Definition : EmbeddingNode { attribute DefKind kind; attribute ordered set [0..*] of Variable parameter; }; class Assertion : EmbeddingNode { //to assert stuff reference sourceCorrectionOf to sourceCorrectionOf of HasSourceCorrection; reference destCorrectionOf to destCorrectionOf of HasDestCorrection; reference conflictingNodeOf to conflictingNodeOf of HasConflictingNode; }; //----------------- Correction between assertions ------------------- //To permit a user to record conflicting between 2 statements/beliefs. typedef string CorrectionKind; //e.g. corrective_specialization, //corrective_generalization, correction (if previous don't apply), //correction (if the previous do not apply; e.g. "counterexample"), //overriding_specialization (e.g. "instantiation") class Correction : EltWithCreator { attribute CorrectionKind kind; reference source to sourceCorrection of HasSourceCorrection; reference dest to destCorrection of HasDestCorrection; reference correctionOf to correctionOf of HasCorrection; }; association HasSourceCorrection { end single Correction sourceCorrectionOf; end set [1..1] of Assertion sourceCorrection; }; association HasDestCorrection { end single Correction destCorrectionOf; end set [1..1] of Assertion destCorrection; }; //Simple elaborations are automatically detected or should be stored //using rhetorical/argumentation relations between assertions. //-------------------- ConflictResolution ---------------------------- //To record that two (or more?) assertions are in conflict //and the corrections that have been made to solve that conflict. typedef string ConflictResolutionStrategy; class ConflictResolution : EltWithoutCreator {//Correction has creator attribute ConflictResolutionStrategy strategy; reference input to conflictingNode of HasConflictingNode; reference output to correction of HasCorrection; }; association HasConflictingNode { end single ConflictResolution conflictingNodeOf; end set [2..*] of Assertion conflictingNode; }; association HasCorrection { end set [0..*] of ConflictResolution correctionOf; end set [0..*] of Correction correction; }; };