//The corrections (and some additions) by Ph. M. are prefixed by "//pm: ".
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;
//------------------------- KRelt ------------------------------
abstract class KRElt {
};
abstract class EltWithCreator {
attribute string comment; //comment stored with the object
attribute Date creationDate;
reference creator to creator of Creates;
}; //pm: direct subclasses: Term, Partition, Node,
//pm: Elaboration, Correction
abstract class EltWithoutCreator : KRElt {
}; //pm: direct subclasses: Value, Namespace Collection, Quantifier
//pm: and ConflictResolution
//A node is not a term (named categories), 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 are.
association Creates {
end single User creator;
end set [0..*] of EltWithCreator elt; //pm: not KRElt
};
//-------------------- Term (named category) ---------------------
//pm: abstract class OntologyElt : KRElt {
//pm: }; //removed since no difference between Term and OntologyElt
abstract class Term: EltWithCreator {
reference instanceOf to instanceOf of HasInstance;
//pm: any term (type or individual) can be instance of a higher-order type
//pm: the association IsOfType has been renamed HasInstance
reference binding to binding of NameBinds;
reference type to instanceOf of HasInstance;
reference mutex1 to mutex1 of Mutex;
//pm: reference mutex2 to mutex2 of Mutex;
//pm: removed since mutex1=mutex2 (exclusion links are symmetric)
reference comp1 to comp1 of Complement;
//pm: reference comp2 to comp2 of Complement;
//pm: removed since comp1=comp2 (complement links are symmetric)
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;
//to refer to nodes (and hence statements) using this term:
reference directNode to termOf of HasConceptNodeTerm;
};
//pm: any term can be an instance, so this class is replaced by the next
//pm: abstract class Instance : Term {
//pm: reference type to instanceOf of HasInstance;
//pm: };
class Individual: Term {//or type0: term that cannot have instances,
}; // subtypes or supertypes
abstract class Type : Term {
reference instance to instance of HasInstance;
reference supertype to supertype of Generalises;
reference subtype to subtype of Generalises;
//pm: any type may be used in a relation signature
//the next two lines replace the ones in ConceptType
reference domainOf to domainOf of HasDomain;
reference rangeOf to rangeOf of HasRange;
//to refer to relations using this type
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
//pm: reference role1 to relnsig of Role1Type;
//pm: reference role2 to relnsig of Role2Type;
};
class RelnType: Type { //pm: RelnSig removed (see below)
/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.
//pm: The next 4 lines are the lines of RelnSig but with better names.
attribute Number minDomain;
attribute Number maxDomain;
attribute Number minRange;
attribute Number maxRange;
reference domain to domain of HasDomain;
reference range to range of HasRange;
};
//pm: class RelnSig: RelnType { //A signature is not a relation type.
//pm: //A relation type HAS a signature.
//pm: attribute Number lower1;
//pm: attribute Number upper1;
//pm: attribute Number lower2;
//pm: attribute Number upper2;
//pm: reference type1 to concept1type of Role1Type;
//pm: reference type2 to concept2type of Role2Type;
//pm: };
//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 { //pm: was called Role1Type
end single RelationType domainOf; //pm: not RelnSig relnsig
end single Type domain; //pm: not ConceptType concept1type
};
association HasRange { //pm: was called Role2Type
end single RelationType rangeOf; //pm: not RelnSig relnsig
end single Type range; //pm: not ConceptType concept2type
};
association HasInstance { //pm: it was called IsOfType
end set [0..*] of Type instanceOf; //pm: was called type
end set [0..*] of Term instance;//pm: Instance -> Term
}; //since types too can be instance of higher-order types
association Generalises {
end set [0..*] of Type supertype;
end set [0..*] of Type subtype;
};
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 set [0..*] of Term members; //pm: not single
end set [0..*] of Term member;
};
association WholePart {
end set [0..*] of Term whole; //pm: not single
end set [0..*] of Term part;
};
association CombinedSubstance {
end set [0..*] of Term combined; //pm: not single
end set [0..*] of Term substance;
};
//--------------------------- Partition -------------------------------
class Partition: EltWithCreator { //pm: it was OntologyElt
};
//---------------------- Value (e.g. Name) ----------------------
abstract class Value: EltWithoutCreator { //it was OntologyElt
};
class Time : Value { //originally Time was a struct but it broke HUTN
attribute Number year;
attribute Number month;
attribute Number day;
attribute Number hour;
attribute Number minute;
attribute Number second;
attribute boolean absolute;
};
class Date : Time {
};
class Duration : Time {
};
class TimeValue: Value { //pm: not yet used
attribute Time d1;
};
class TimeRange: TimeValue { //pm: not yet used
attribute Time d2;
};
//pm: class TermValue: Value { //pm: not yet used
//pm: reference term to term of TermRef;
//pm: };
//pm: association TermRef {
//pm: end single TermValue termvalue;
//pm: end single Term term;
//pm: };
class IntValue: Value {
attribute Number v1;
};
class IntRange: IntValue { //pm: not yet used
attribute Number v2;
};
class StringValue: Value {
attribute string s1;
};
class StringRange: StringValue { //pm: not yet used
attribute string s2;
};
//------------------ User/NameSpace and Name --------------------
class Name: StringValue {
reference binding to binding of NameIs;
};
class NameSpace: EltWithoutCreator { //pm: not Term
reference term to term of HasRepresentation;
reference my_binding to binding of AssignsName;
};
class User: NameSpace {
reference elt to elt of Creates;
attribute string password;
};
association HasRepresentation { //pm: added this
end single NameSpace representationOf;
end set [0..*] of Term term; //most likely only 1
};
// I would like a ternary assocation (NameSpace, Name, Term)
// 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;
};
//-------------------------- Collection --------------------------------
//Not a node because a node with a collection may or may not be
//quantified, so multi-inheritance would be required.
// 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 Collection : EltWithoutCreator { //not ConceptNode
attribute CollectionKind kind;
attribute Aggregator agg;
attribute Distributes dist;
};
class NodeCollection : Collection {
//pm: reference node_member to member of HasMember; //node!=term
reference collElt to collElt of HasCollectionElt;
};
association HasCollectionElt {
composite end single NodeWithCollection collEltOf;//composite?
end set [0..*] of Node collElt; //Node or EmbeddedNode
};
//------------------------- Node ------------------------
class Node : EltWithCreator { //pm: this is a new class
};
enum QuantifierKind { a_an_the_some, few, most_majority, all,
atMost, atLeast, about };
//pm: quantifiers modified to reflect equivalences
//pm: "exactly" removed since implicit
class Quantifier : EltWithoutCreator {
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 ConceptNode: Node { //pm: ConceptInstance replaced by Node
attribute boolean negate;
attribute string text;
attribute Quantifier quantifier;
attribute Qualifier qualifier;
reference term to term of HasConceptNodeTerm; //node not a term
reference src_of to src_of of IsSrcOf;
reference dest_of to dest_of of IsDestOf;
//pm: reference collection to members of HasMember; //node not a term
reference collEltOf to collEltOf of HasCollectionElt;
reference is_subject to is_subject of HasSubject;
};
association HasConceptNodeTerm {
end set [0..*] of Node termOf;
composite end single Term term;
};
class Relation : Node { //pm: not "RelnInstance : Instance"
attribute boolean converse;
attribute Modality modality;
reference type to type of HasNodeType; //a node is not a term
reference src to src of IsSrcOf;
reference dest to dest of IsDestOf;
};
association HasRelationType { //pm: new association
end set [0..*] of ConceptNode typeOf;
composite end single Type type; //not always RelationType
};
association IsSrcOf {
composite end single ConceptNode src; //pm: not just Node
end set [0..*] of Relation src_of;
};
association IsDestOf {
end single ConceptNode dest; //pm: not just Node
composite end single Relation dest_of;
};
//................... EmbeddingNode (statement) ......................
abstract class Stmt : Node {
reference subject to subject of HasSubject;
};
association HasSubject {
composite end single Stmt is_subject;
end single Node subject;
};
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 { //pm: is this class useful?
// a DefnNode is only allowed to be used by Defn
attribute list [0..*] of Parameter formal;
};
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;
};
//------------------ Elaboration between assertions -------------------
// specialised assertions can elaborate more general assertions
typedef string ElaborationKind; // "example", "counterexample" ...
class Elaboration : EltWithCreator { //not 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
//------------------ Correction between assertions -------------------
typedef string CorrectionKind;
class Correction : EltWithCreator { //pm: not 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;
};
//------------------------- ConflictResolution ------------------------
// how to record that two or more assertions are in conflict
typedef string ConflictResolutionKind;
//the next class was called Conflict
class ConflictResolution : EltWithoutCreator { //pm: not KRElt
attribute ConflictResolutionKind 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;
};
association Fixes {
end set [0..*] of Correction correction;
end set [0..*] of ConflictResolution conflict;
};
};