OpenCyc Tutorial : An Introductory Walk
Through Ontological Engineering

Version 0.7


Contents

Introduction

Step One: Find Relevant, Already-existing Constants

Step Two: Create New Constants

Step Three: Make Assertions On New Constants

Step Four: Testing


Introduction

In this tutorial you will witness the creation of two new constants, and the making of some simple assertions on those constants.

Suppose that you have just acquired two kittens (who shall be referred to as "Billy" and "Peter") and they are so enchanting that you feel they should be represented in your version of the OpenCyc KB. Here is how one ontologist would go about such a process, described in first-person terms. I encourage you to follow me as I walk you through the steps I would take, using your browser. Ontological engineering - like any other engineering - is an intensely practical (albeit virtual), task which can really only be learned by doing it.

The process I will go through can be broken down into four main steps. Ok, let's begin.

Step One: Find Relevant, Already-existing Constants

First of all, I will try and find relevant, already-existing constants - constants that I will be able to use to make the assertions about Billy and Peter that I want to make. Of course I could create every constant I wish to use to talk about Billy and Peter, but why reinvent the ontological wheel? (Beware: this task is often harder than it looks...many a cyclist has torn out hair having just worked hard to create a new constant which they perceived as filling a hole in the ontology (say..." moneyAmountOfCoin "), only to find an equivalent lurking in the KB under a name they did not expect (say..." tenderValue ")).

First and most obviously, I guess I will want to say that Billy and Peter are kittens. That is probably the most salient piece of information I have about them. Is there a Cyc term that means "kitten"?

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "kitten" in the text field next to the "Complete" button in the top frame and click on the "Show" button...   [ Show me ]

Unfortunately this turns up nothing. There is no constant called #$Kitten in the OpenCyc KB.

Click here for further explanation of why you just did the above.   What does the '#$' in front of "#$Kitten" mean?

Maybe, instead of saying that Billy and Peter are kittens, I can say that they are juvenile cats. So now let's try "cat".

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "cat" in the text field next to the "Complete" button in the top frame and click on the "Show" button.

No luck there, either....In cases such as this, my next step will be to try something more general. Hmmmm....how about "pet"?

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "pet" in the text field next to the "Complete" button in the top frame and click on the "Show" button.

Cyc presents a choice of two constants:

DomesticPet
NonPersonAnimal

How does Cyc produce these two constants from a string ("pet") which is different than both of them? The answer lies with Cyc's 'natural language support'. For example, the KB contains the following two "assertions" (or facts) related to #$DomesticPet:

Mt : GeneralEnglishMt
  (denotation Pet-TheWord SimpleNoun 0 DomesticPet)
  M(multiWordString ("domestic") Pet-TheWord SimpleNoun DomesticPet)

The first assertion above relates the word "pet" to the Cyc constant "#$DomesticPet". The second on relates the phrase "domestic pet" to the same Cyc constant.

Click here for suggested reading on this topic   Further reading on Cyc NL

#$DomesticPet is a more specific constant than #$NonPersonAnimal , since #$DomesticPet is a specialization of #$DomesticatedAnimal , which is a specialization of #$TameAnimal , which is a specialization of #$NonPersonAnimal .

Note: More specific collections 'inherit' the information that exists on the collections they are specializations of, and have further information as well. This hierarchy is ordered using the predicate #$genls.

#$DomesticPet is therefore better for me to use to describe Billy and Peter. The reason for this may be summarized in the 'Maxim of Efficient Ontologizing':

The Maxim Of Efficient Ontologizing: Be as specific as possible without being false.

I should say that, strictly speaking, this maxim applies to the writing of individual assertions (which state facts) and not to the writing of rules (which allow Cyc to deduce things from the facts it knows). When it comes to rules, the more general you can be (without being false) the better! But this is an introductory tutorial and we will therefore be confining ourselves to individual assertions.

#$DomesticPet is a collection, so to use this constant to make assertions about Billy and Peter I am going to have to assert that they are both members of this collection.

What are some other things I am likely to want to say about Billy and Peter? Well, another interesting fact about them is that they are brothers. Does this mean that, as was the case with #$DomesticPet , they should be asserted to be a member of a collection called, say, #$Brother ? (There is actually a problem with this. Can you see what it is?)

Click here for further explanation of why you just did the above.   What's wrong with making a collection called #$Brother?

Billy and Peter are not just brothers per se, they are brothers of each other. Such relationships between two or more things are handled in Cyc using predicates rather than collections.

Click here for suggested reading on this topic   Further reading on Predicates

Specific relationships between two or more things are handled in Cyc using predicates rather than collections.

Is there a predicate called #$brothers ?

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "brothers" in the text field next to the "Complete" button in the top frame and click on the "Show" button..   [ Show me ]

No there is not.

Again, I realize that I better back up and try something more general. What is a more general version of the concept of brotherhood? Billy and Peter are...related to one another, i.e. they are relatives. Let's try "relatives"....

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "relatives" in the text field next to the "Complete" button in the top frame and click on the "Show" button.

Yes, there is a #$relatives ! However, don't forget the Maxim of Efficient Ontologizing. Perhaps there is something a bit more specific, if not as specific as "brothers" would be, that we can use.

Try it yourself! Enter this into your copy of OpenCyc.    From the "2 possible terms" page, click on the relatives link to get to view the details of #$relatives . With #$relatives up, look at the left-hand frame (the "Term Index Frame"), under Arg2, and click on "genlPreds".   [ Show me ]

Click here for further explanation of why you just did the above.   How do I use the Term Index Frame?

This presents a list of all the predicates which are direct specializations of #$relatives , as follows:

Mt : BiologicalSocialVocabularyMt
  (genlPreds grandchildren relatives)
  (genlPreds cohabitingFamilyMembers relatives)
  (genlPreds children relatives)
  (genlPreds coreRelatives relatives)

Mt : BiologyVocabularyMt
  (genlPreds siblings relatives)
  (genlPreds biologicalRelatives relatives)

Note: Just as Cyc collections are arranged in an information-inheriting hierarchy ordered using the predicate #$genls, Cyc predicates are arranged in an information-inheriting hierarchy ordered using the predicate #$genlPreds.

Click here for suggested reading on this topic   Tutorial lesson on predicates and the predicate hierarchy

Aha! #$siblings is more specific than #$relatives , and it is also true of Billy and Peter. So we can use that.

What else do I want to say about Billy and Peter? They like each other a lot (though they also roll around on the floor a lot biting each other...). So the next thing to do (which should not by now be too surprising) is to type in "likes", to see if there is some term (probably a predicate) I can use to say that Billy and Peter like each other.

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "likes" in the text field next to the "Complete" button in the top frame and click on the "Show" button.   [ Show me ]

You should see Cyc produce a constant with the somewhat bizarre name of #$likes-Generic . Some background information is in order here: making a name of the form "[X]-generic" is something of a Cyc convention which means that the constant in question tops a hierarchy of terms regarding [X], which have been defined more specifically.

A constant with a name of the form "[X]-generic" tops a hierarchy of more specifically defined terms regarding [X].

In our case, obviously, [X] will be something to do with 'liking'). Such a term is often an 'umbrella term', designed to gather together more specific terms, rather than having actual assertions made on it. Let's therefore look for something more specific. With #$likes-Generic up, let's see how its comment echoes my remark above:

Try it yourself! Enter this into your copy of OpenCyc.    The right frame should say "Predicate : likes-Generic" at the top. Scroll down in the right frame until you reach "comment:".   [ Show me ]

(likes-Generic SUBJ OBJ) means that SUBJ likes OBJ. This
         is a very general liking relation which is most useful for
         organising liking relations and for use during inference; for
         representation purposes, use a spec-Pred.

So let's find the appropriate 'spec-Pred' (this is Cyc-talk for 'more specialized predicate') for #$likes-Generic .

'Spec-Pred' is Cyc-talk for 'more specialized predicate'.

Here we could just do what we did for #$relatives , which was to look at the left-hand frame, under Arg2, and click on "genlPreds".

Try it yourself! Enter this into your copy of OpenCyc.    With #$likes-Generic still up , look at the left-hand frame, under Arg2, and click on "genlPreds".   [ Show me ]

You should see just one assertion:

Mt : AgentGVocabularyMt
  (genlPreds likesObject likes-Generic)

What is this #$likesObject ? Let's have a look:

Try it yourself! Enter this into your copy of OpenCyc.    Click on the word "likesObject" in the assertion.   [ Show me ]

Mt : AgentGVocabularyMt
comment : "(likesObject AGT OBJ) means that when the sentient agent
AGT is interacting in some way with OBJ, that agent feels some measure
of Enjoyment --- that is, (feelsEmotion AGT Enjoyment). The kinds of
interactions that produce Enjoyment depend largely on what kind of thing
OBJ is. Thus, `Joe likes the Mona Lisa' implies that Joe feels Enjoyment
when viewing the Mona Lisa. But `Joe likes pizza' implies that Joe feels
Enjoyment when eating that kind of food. There are some specialized
predicates of likesObject that give more information about the kind of
interaction between AGT and OBJ that results in Enjoyment; see, e.g.,
#$likesSensorially and #$likesAsFriend." 

I'm not sure that I want to assert #$likesObject of Billy and Peter. Billy doesn't quite like Peter in the way that Joe likes pizza (Billy's frequent biting of Peter notwithstanding). Hmmmm.....And what are these #$likesSensorially and #$likesAsFriend that appear in the comment? Why did they not appear when I clicked on "genlPreds"? (Can you figure it out?)

In fact the answers are different for the two different predicates. The answer for #$likesSensorially is that it is a Cyc constant that was not made public - it thus does not exist in the OpenCyc KB. (You can tell this because it is printed in black, not clickable blue).

The Cyc constants you see which are not links were not made public and therefore do not exist in the OpenCyc KB.

The answer for #$likesAsFriend is a little more complicated. Merely clicking on the "genlPreds" under "Arg2" produces all assertions directly made of the form (genlPreds ?X likes-Generic) , but a list of all such ?X is not a list of all the spec-Preds of #$likes-Generic . This is because #$genlPreds is a transitive predicate (i.e. if X is a spec of Y and Y is a spec of Z then X is a spec of Z). So there can be many more specs of a given constant than there are 'direct specs' (specs linked to that constant by specific assertions).

#$genlPreds is a transitive predicate (i.e. if X is a spec of Y and Y is a spec of Z then X is a spec of Z). So there can be many more specs of a given constant than there are 'direct specs' (specs linked to that constant by specific assertions).

There is actually a cool tool for viewing all the specs of a given constant, though. If you look slightly to the right of the "genlPreds", you will see a green plus.

Try it yourself! Enter this into your copy of OpenCyc.    Click on the green plus slightly to the right of "genlPreds".   [ Show me ]

You should see the following:

Last query in AgentGVocabularyMt :
(genlPreds ?ARG1 likes-Generic)

3 answers for ?ARG1 :
likes-Generic   likesAsFriend   likesObject

Now #$likesAsFriend appears.

Click here for further explanation of why you just did the above.   Why does #$likes-Generic also appear in the list?

By the way, you probably noticed that as well as the green plus next to "genlPreds", there is also a red diamond . This is in some ways an even cooler tool. You might like to click on it and see what it does....

So let's have a look at #$likesAsFriend :

Try it yourself! Enter this into your copy of OpenCyc.    Click on the word "likesAsFriend" in the main frame of the KB browser.   [ Show me ]

Mt : AgentGVocabularyMt
comment : "(likesAsFriend AGT1 AGT2) means that AGT1 enjoys
interacting socially with AGT2. See also the #$FeelingAttributeTypes
Friendliness. Note: this predicate does not imply that AGT1 likes AGT2
only as a friend -- there may be romantic feelings, and other feelings, as
well." 

This sounds more like Billy and Peter to me, if "interacting socially" is not just restricted to human society and also covers such activities as eating together and rolling around on the floor chewing one another's ears. This does seem plausible to me. To be sure, let's check what are called the 'argument-constraints' on #$likesAsFriend . If this predicate is intended only to apply to human beings, then next to the #$arg1Isa and #$arg2Isa predicates in the main frame for #$likesAsFriend (assuming it has been well-ontologized) #$Person should appear. Let's check that...

Try it yourself! Enter this into your copy of OpenCyc.    Look immediately above the comment I just quoted and find arg1Isa and arg2Isa.   [ Show me ]

In fact #$Person does not appear there, only #$PerceptualAgent . Will Billy and Peter meet this criterion? Yes they will, once they have been asserted to be members of the collection #$DomesticPet , as (#$genls #$DomesticPet #$PerceptualAgent) is true. (Can you verify this? Hint: you can do this using the green plus you just learned about). So I will use #$likesAsFriend .

Lastly, how about saying how old Billy and Peter are? They are currently 11 weeks old. Let's type in "age".

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "age" in the text field next to the "Complete" button in the top frame and click on the "Show" button.

There is an #$age ! It too turns out to be a predicate. Here are some of its defining assertions:

Mt : BaseKB
arg1Isa : SomethingExisting 
arg2Isa : Time-Quantity 
arg1Format : SetTheFormat 
arg2Format : IntervalEntry

What does this mean? It means that the predicate #$age takes two arguments and the first argument (the thing which has the age) must be an instance of #$SomethingExisting , and the second argument (the age of the thing) must be an instance of #$Time-Quantity . Are Billy and Peter instances of #$SomethingExisting ? Yes they are. (You might like to verify this - again, using the green plus .)

The "formats" of the two arguments are a somewhat more technical affair. The #$arg1Format assertion basically means that different things may occupy the arg1 position for any given arg2 (Thus, not just one but an arbitrary number of creatures may be, say, 10 years old at any given time). The #$arg2Format assertion means that the age given may be a single, discrete value, or it may be a range (say, between 3 and 4 years). See the comment on #$IntervalEntry for more details on this.

Click here for suggested reading on this topic   Further reading on argument formats (#$arg1Format)

What exactly is a #$Time-Quantity , though? Is '11 weeks' an instance of it? Let's take a look at this constant. I can't find any assertion of the form (#$isa "11weeks" #$Time-Quantity) . Hmmmm.... What I do find out, however (with the help of some considerable experience with such matters :-)) is that instances of #$Time-Quantity are the results of a set of functions (functions which are gathered together in a collection called #$UnitOfTime ). We have so far encountered collections, individual instances of collections, predicates and microtheories. A function is yet another Cyc animal (a "new beast for our zoo [of logical forms]", as Bertrand Russell once put it).

Click here for suggested reading on this topic   Further reading on functions in Cyc

Let's browse the list of functions collected under #$UnitOfTime (by looking under "Arg2" in the frame on the left, and clicking on "isa").

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "UnitOfTime" in the text field next to the "Complete" button in the top frame and click on the "Show" button.. When its definitional information appears in the main frame, look at the left-hand frame, under Arg2, and click on "isa".   [ Show me ]

You should see the following:

Collection : UnitOfTime
GAF Arg : 2
Mt : BaseKB

(isa DaysDuration UnitOfTime)
  (isa SecondsDuration UnitOfTime)
  (isa QuartersDuration UnitOfTime)
  (isa HoursDuration UnitOfTime)
  (isa WeeksDuration UnitOfTime)
  (isa DecadesDuration UnitOfTime)
  (isa YearsDuration UnitOfTime)
  (isa MonthsDuration UnitOfTime)
  (isa MinutesDuration UnitOfTime)

#$WeeksDuration looks promising. Let's take a look at that.

Try it yourself! Enter this into your copy of OpenCyc.    Click on the word "WeeksDuration" in the main frame of the KB browser.   [ Show me ]

Its comment says:

            "A UnitOfTime function that takes one or two real numbers as
          arguments and returns, as its value, a comparable Time-Quantity
          attribute measured in weeks. More precisely, an expression of the
          form (WeeksDuration NUM) denotes the ("point-value")
          Time-Quantity of being exactly NUM weeks in duration, and an
          expression of the form (WeeksDuration MIN MAX) denotes the
          (properly interval-like) Time-Quantity of being at least MIN
          weeks and at most MAX weeks in duration." 

What this means is that I can use " (#$WeeksDuration 11) " to represent 11 weeks, and that the result of applying the function in this way will be an instance of #$Time-Quantity (which is what I need, since I want to plug it into an assertion using the predicate #$age , in the second argument position. The exact way in which this will happen will be explained in Step 3.).

Step One Summary: We have now identified the following constants which can be used to make assertions about Billy and Peter:

Step Two: Create New Constants

In the previous step, we identified some constants which can be used to make assertions about Billy and Peter. Let's now create new constants to represent Billy and Peter themselves.

Before taking this step, if you are logged in as Guest , you will need to log in again as CycAdministrator , as it is not possible to create new constants as Guest .

You must be logged in as CycAdministrator in order to create new constants. In OpenCyc, Guest does not have the same privileges as CycAdministrator .

Let's start with Billy. Go to the Tools page and click on "Create".

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame.   [ Show me ] This will bring up the Tools page. Click on the "Create" link in the column on the left.   [ Show me ]

The first thing to do is to choose a name for the new constant. "Billy" seems a logical choice. Of course if there were other Billys, Bills, etc. already in the KB, it might be wise to differentiate this constant a little further via its name. When this is desired, a Cyc convention is to append "-The[something]" at the end of a constant name (e.g. Othello-TheGame , Othello-TheMovie ). So I could do "Billy-TheKitten".

To differentiate constants by name, a Cyc convention is to append "-The[something]" at the end of a constant name (e.g. Othello-TheGame , Othello-TheMovie ).

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "Billy" in the main frame of the KB browser. Click on the "Create Constant" button.   [ Show me ]

Now, merely clicking on the button "Create Constant" is enough to give Billy a place in the ontology. I can now call up the #$Billy constant, just like any other Cyc constant - though if I do this, all I will see so far is 'bookkeeping assertions' - assertions about who created the constant and when it was created.

Let's now create #$Peter in the same way that we created #$Billy .

Try it yourself! Enter this into your copy of OpenCyc.    On the "Constant Create operation completed" page, click on the "Back to previous (stale) page" button.   [ Show me ] This will bring you to the "Browser Tools" page. Enter the word "Peter" in the field in the main frame. Click on the "Create Constant" button.   [ Show me ]

Step Two summary - We now have two new constants, one for each kitten, on which we can start making assertions (or, as it is sometimes put, 'entering knowledge').

Step Three: Make Assertions On New Constants

In the previous step, we created some constants that we will use as we make new assertions in Step 3. If you have not yet created those new constants, please go back and complete Step 2.

Steps Three and Four of this longer version deal with microtheories and where to place assertions in the microtheory hierarchy. Once you have completed steps three and four of this version, you might go back to the shorter version in order to gain a different perspective on microtheories.

The next step is to make the assertions I want to make on my new constants. I said that I wanted to assert that Billy and Peter were both members of the #$DomesticPet collection (or, in Cyc-talk, 'instances of #$DomesticPet '). Let's go to the Tools page and click on "Assert".

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame.   [ Show me ] This will bring up the Tools page. Click on the "Assert" link in the column on the left.   [ Show me ]

This should bring up the assertion-making tool. The "Assert" tool is used to make one assertion at a time. It is not the only way in which assertions can be entered in the KB, but it is the easiest and most straightforward.

The Assert tool is used to make one assertion at a time. It is not the only way in which assertions can be entered in the KB, but it is the easiest and most straightforward.

Click here for suggested reading on this topic   Further reading on making assertions

Try it yourself! Enter this into your copy of OpenCyc.    With the "Assert Formula" page still up, enter "(isa Billy DomesticPet)" in the large text box.   [ Show me ]

Look at what you just typed and note that:

The next thing we need to do (often forgotten!) is to click on the button which is somewhat mysteriously named "Cyclify".

Try it yourself! Enter this into your copy of OpenCyc.    With the "Assert Formula" page still up, and "(isa Billy DomesticPet)" in the large text box, click on the "Cyclify" button (immediately above the large text box).   [ Show me ]

This makes a " #$ " appear in front of every term in the formula. This is necessary because "isa", "Billy", and "DomesticPet" are not terms in CycL - " #$isa ", " #$Billy " and " #$DomesticPet " are. (The Cyclify tool is more than just an automatic '"#$" pre-pender', by the way. It actually searches the KB for terms matching the strings in the formula, and if it does not find a CycL term matching a string, it does not prepend a "#$" to it. This way, if I inadvertently make a typo, say if I type "Blly", this will become obvious when it is not "cyclified".)

Now that we have cyclified it, we could go ahead and assert the formula (by clicking on "Assert Formula"). However, what I normally do is click "Diagnose Formula" first. This checks the formula for well-formedness of various kinds.

Try it yourself! Enter this into your copy of OpenCyc.    Click on the "Diagnose Formula" button (above Direction :).   [ Show me ]

You should see the following:

Formula not Well-Formed.

Mt : BaseKB
Formula : 
(isa Billy DomesticPet)

Diagnosis : 

Term DomesticPet violates arg-isa Collection
applicable to argument 2 of relation isa
in mt BaseKB.
Term DomesticPet violates arg-isa SetOrCollection
applicable to argument 2 of relation isa
(via elementOf)
in mt BaseKB.
Term DomesticPet violates arg-genls Thing
applicable to argument 2 of relation isa
in mt BaseKB.

Consider asserting 
  (isa Billy DomesticPet)
in mt HumanActivitiesMt.

Oh no! what is the problem? Actually the Diagnose tool is intelligent enough to state what the problem is in this case. There is a an issue with Microtheories.

Click here for suggested reading on this topic   Tutorial lesson on Microtheories

Every Cyc assertion is made in some microtheory, and I was trying to make my assertion in the microtheory known as the "BaseKB".

Every Cyc assertion is made in some microtheory.

On the "Assert Formula" page, note the string "BaseKB" in the small text field next to "Mt :" - this microtheory is set as the default in this window. The #$BaseKB is the the original Cyc microtheory.

The #$BaseKB is the original Cyc microtheory and is the only microtheory visible from all others.

Note: Just as Cyc collections are arranged in an information-inheriting hierarchy ordered using the predicate #$genls, and Cyc predicates are arranged in an information-inheriting hierarchy ordered using the predicate #$genlPreds, Cyc microtheories are arranged in an information-inheriting hierarchy ordered using the predicate #$genlMt.

Click here for suggested reading on this topic   Further reading on #$genlMt

Let's call up #$DomesticPet .

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "DomesticPet" in the text field next to the "Complete" button in the top frame and click on the "Show" button.   [ Show me ]

This shows that a lot of the key assertions on "DomesticPet" (e.g. those regarding #$isa and #$genls ) are made not in the #$BaseKB , but in another microtheory, #$HumanActivitiesMt . From #$HumanActivitiesMt it is possible to 'see' assertions in the #$BaseKB (which is really just a vividly metaphorical way of saying that all assertions true in the #$BaseKB are also true in #$HumanActivitiesMt ) -- but not vice versa. Thus, from the perspective of the #$BaseKB , Cyc doesn't know anything at all about #$DomesticPet - it does not even know that it is a collection. But it needs to know that it is a collection in order to accept an assertion like (#$isa #$Billy #$DomesticPet) . (This is because the second argument to an #$isa assertion must be a collection - see if you can find the relevant assertion on #$isa which states this.)

Let's go back to the Assert page, change the microtheory in the Mt text field to #$HumanActivitiesMt and try "Diagnose" once more.

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame.   [ Show me ] This will bring up the Tools page. Click on the "Assert" link in the column on the left.   [ Show me ] This will bring up the Assert Formula page. Delete "BaseKB" from the text box next to "Mt :" and enter "HumanActivitiesMt" in its place.   [ Show me ] Enter "(isa Billy DomesticPet)" in the large text box.   [ Show me ] Now click on the "Diagnose Formula" button (above Direction :).   [ Show me ]

This time the assertion should be fine.

Let's click on "Assert".

Try it yourself! Enter this into your copy of OpenCyc.    Finish asserting by clicking on the "Back" button of the Formula Diagnosis page   [ Show me ] and then clicking on the "Assert Formula" button (in the top right corner of the main frame of the Assert Formula page).   [ Show me ]

Now let's go ahead and make the same assertion on #$Peter .

Try it yourself! Enter this into your copy of OpenCyc.    Click on the "Back to previous (stale) page" button at the top of the main frame.   [ Show me ] Change "#$Billy" to "#$Peter". Click on the "Cyclify" button (immediately above the large text box). Click on the "Diagnose Formula" button (above Direction :). Click on the "Back" button of the Formula Diagnosis page and then click on the "Assert Formula" button (in the top right corner of the main frame of the Assert Formula page).

I can now try asserting that Billy and Peter are siblings, using the predicate #$siblings . Learning from the mistakes of last time, before asserting I call up #$siblings to see which microtheory it is defined in.

Before making an assertion, call up key constants you plan to use to see which microtheories they are defined in.

It turns out to have definitional assertions in #$BiologyVocabularyMt and #$HumanSocialLifeMt (siblinghood is a biological concept as well as describing certain human social relations). Billy and Peter are not human, so should I choose #$BiologyVocabularyMt to make my assertion in?

Actually, I do not. A slightly subtle issue here is that '[X]VocabularyMts' are designed for so-called 'definitional assertions' - a term which is hard to define precisely but can be characterized roughly as those assertions which outline the very meaning of a term.

'* VocabularyMts' are designed for so-called 'definitional assertions'.

If #$siblings did not take two instances of #$Animal as arguments (say, if it took two instances of #$StoneStuff , i.e. if it represented a relationship existing between two pieces of rock) there is no way that #$siblings could mean the same thing. Consider, on the other hand, my assertion that Billy and Peter are siblings. If I do or do not make this assertion, it is not going to change the meaning of what it is to be a sibling. (It must be admitted that certain interesting philosophical issues raise their heads here, but, alas, this is not the time or place...).

Therefore I will endeavour to make my assertion in #$BiologyMt - #$BiologyVocabularyMt 's non-definitional counterpart. Let's go back to the Assert page and enter (#$siblings #$Billy #$Peter) , with " BiologyMt " entered up in the Mt text field. (Don't forget to Cyclify!)

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame. This will bring up the Tools page. Click on the "Assert" link in the column on the left. This will bring up the Assert Formula page. Delete "BaseKB" from the text box next to "Mt :" and enter "BiologyMt" in its place. Enter "(siblings Peter Billy)" in the large text box. Click on the "Cyclify" button (immediately above the large text box).

Now let's Diagnose again...

Try it yourself! Enter this into your copy of OpenCyc.    Click on the "Diagnose Formula" button (above Direction :).

Another problem! The following comes up:

Formula not Well-Formed

Mt : BiologyMt
Formula : 
(siblings Peter Billy)

Diagnosis : 

Term Billy violates arg-isa Animal
applicable to argument 1 of relation siblings
in mt BiologyMt.
Term Billy violates arg-isa Organism-Whole
applicable to argument 1 of relation siblings
(via relatives)
in mt BiologyMt.
Term Billy violates arg-isa Animal
applicable to argument 1 of relation siblings
in mt BiologyMt.
Term Billy violates arg-isa Organism-Whole
applicable to argument 1 of relation siblings
(via relatives)
in mt BiologyMt.
Term Peter violates arg-isa Animal
applicable to argument 2 of relation siblings
in mt BiologyMt.
Term Peter violates arg-isa Organism-Whole
applicable to argument 2 of relation siblings
(via relatives)
in mt BiologyMt.
Term Peter violates arg-isa Animal
applicable to argument 2 of relation siblings
in mt BiologyMt.
Term Peter violates arg-isa Organism-Whole
applicable to argument 2 of relation siblings
(via relatives)
in mt BiologyMt.

Can you see what the problem is? Again it is a knowledge-in-Microtheories issue. Look at the argument-constraints on #$siblings :

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "siblings" in the text field next to the "Complete" button in the top frame and click on the "Show" button.   [ Show me ] Scroll down to find arg1Isa and arg2Isa.   [ Show me ]

Mt : BiologyVocabularyMt
arg1Isa : Animal 
arg2Isa : Animal

Cyc doesn't know that Billy and Peter are instances of #$Animal in #$BiologyMt . It does know this about Billy and Peter in #$HumanActivitiesMt , but #$HumanActivitiesMt is not visible from #$BiologyMt . (To put it more technically, (genlMt #$BiologyMt #$HumanActivitiesMt) is not true.)

What to do? Well, one solution is just to tell Cyc what it needs to know here. Let's call up the Assert page again, and assert (isa Billy Animal) in BiologyMt .

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame.   [ Show me ] This will bring up the Tools page. Click on the "Assert" link in the column on the left.   [ Show me ] This will bring up the Assert Formula page. Delete "BaseKB" from the text box next to "Mt :" and enter "BiologyMt" in its place.   [ Show me ] Enter "(isa Billy Animal)" in the large text box.   [ Show me ] Click on the "Cyclify" button (immediately above the large text box).   [ Show me ] Click on the "Diagnose Formula" button (above Direction :).   [ Show me ] Finish asserting by clicking on the "Back" button of the Formula Diagnosis page   [ Show me ] and then clicking on the "Assert Formula" button (in the top right corner of the main frame of the Assert Formula page).   [ Show me ]

Now let's do the same for Peter.

Try it yourself! Enter this into your copy of OpenCyc.    Click on the "Back to previous (stale) page" button at the top of the main frame.   [ Show me ] Change "#$Billy" to "#$Peter". Click on the "Cyclify" button (immediately above the large text box). Click on the "Diagnose Formula" button (above Direction :). Click on the "Back" button of the Formula Diagnosis page and then click on the "Assert Formula" button (in the top right corner of the main frame of the Assert Formula page).

Now it is as if from the standpoint of biology Cyc sees Billy and Peter as animals (that is the most salient biological fact about them, if you will), while from the standpoint of humans and their activities, Cyc sees Billy and Peter as domestic pets (that is the most salient fact about them from this admittedly 'species-centric' standpoint).

Now let's try once again to assert (siblings Peter Billy) in BiologyMt ....

Try it yourself! Enter this into your copy of OpenCyc.    Click on the "Back to previous (stale) page" button at the top of the main frame.   [ Show me ] Change "#$isa" to "#$siblings". Change "#$Animal" to "#$Billy". Click on the "Cyclify" button (immediately above the large text box). Click on the "Diagnose Formula" button (above Direction :). Click on the "Back" button of the Formula Diagnosis page and then click on the "Assert Formula" button (in the top right corner of the main frame of the Assert Formula page).

This should be fine. (A question: do I now need to assert (siblings Billy Peter) ? If not, why not?)

Let's now turn to the predicate #$likesAsFriend . Pulling this constant up (hint hint!) reveals that it is defined in yet another microtheory - #$AgentGMt . What is this? Let's pull it up (One of the beauties of the Cyc ontology is that just about everything can be pulled up, and its comment and definitional assertions inspected).

One of the beauties of the Cyc ontology is that just about everything can be pulled up, and its comment and definitional assertions inspected.

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "AgentGMt" in the text field next to the "Complete" button in the top frame and click on the "Show" button.   [ Show me ]

The comment says:

          "The Microtheory that defines the concept of Agent and
          properties of agents." 

This comment is somewhat terse. However note the letter " G " in the name. This is Cyc-code for "most general" (or again - "generic").

The letter "G" in the name of a microtheory (i.e. " AgentGMt ") is Cyc-code for "most general". Thus, it is the most general microtheory in which statements regarding agency, for example, can be made.

Thus, this microtheory will be the most general microtheory in which statements regarding agency (a concept notoriously tricky but having something to do with 'self-directed entities doing things') can be made. One would thus naturally expect many other, agency-related, microtheories to be 'spec-Mt's (does this new word make sense? I hope so) of it. To verify this, can you guess what to do?

Try it yourself! Enter this into your copy of OpenCyc.    With AgentGMt still up, look at the left-hand frame, under Arg2, and click - this time - on "genlMt".   [ Show me ]

You can of course also use the green plus and the red diamond to perform their characteristic functions as well. Note that when you use the green plus , each of the many Mts that come up can 'see' #$AgentGMt - that is, all the assertions true in #$AgentGMt will be true in the Mts that come up.

In order to assert (likesAsFriend Billy Peter) , I need to find a microtheory in which can be seen:

A microtheory which could see both #$BiologyMt and #$AgentGMt would do the job. Can you find one?

In fact, using the green plus as you did before on the arg2 genlMt of #$AgentGMt brings up (among other things) #$BiologyMt . Does this mean we could make the assertion in #$AgentGMt ? No, it means that we could make the assertion in #$BiologyMt ! This is because #$BiologyMt can 'see' #$AgentGMt but not vice versa. So now let's assert (likesAsFriend Billy Peter) in #$BiologyMt .

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame. This will bring up the Tools page. Click on the "Assert" link in the column on the left. This will bring up the Assert Formula page. Delete "BaseKB" from the text box next to "Mt :" and enter "BiologyMt" in its place. Enter "(likesAsFriend Billy Peter)" in the large text box. Click on the "Cyclify" button (immediately above the large text box). Click on the "Diagnose Formula" button (above Direction :). Finish asserting by clicking on the "Back" button of the Formula Diagnosis page and then clicking on the "Assert Formula" button (in the top right corner of the main frame of the Assert Formula page).

Click here for further explanation of why you just did the above.   Do I now also need to assert (likesAsFriend Peter Billy)?

Finally let's assert the ages of Billy and Peter.

Once again, let's check what microtheory the predicate we're using is defined in....If you call up #$age , you will see that this one is defined in the #$BaseKB .

Try it yourself! Enter this into your copy of OpenCyc.    Enter the word "age" in the text field next to the "Complete" button in the top frame and click on the "Show" button.

This is nice and simple, as the #$BaseKB is (as I mentioned before) visible from all other microtheories.

Let's go back to the Assert page and, in the large text field, enter (age Billy (WeeksDuration 11)) .

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame.   [ Show me ] This will bring up the Tools page. Click on the "Assert" link in the column on the left.   [ Show me ] This will bring up the Assert Formula page. Enter "(age Billy (WeeksDuration 11))" in the large text box.   [ Show me ]

Note the way in which the function #$WeeksDuration , and its single argument, 11 , are surrounded by parentheses to create a single entity which then serves as the second argument to the predicate #$age (which is defined as having two arguments and two arguments only). Such an entity, composed of a function and one or more arguments, is known in Cyc-talk as a NAT, which stands for "Non-Atomic Term".

Click here for suggested reading on this topic   Further reading on NATs

In which microtheory should this assertion be made, though? Can you work it out? I'm sure you can. :-)

Try it yourself! Enter this into your copy of OpenCyc.    Once you have identified the proper microtheory, delete "BaseKB" from the text box next to "Mt :" and enter the proper Mt in its place.   [ Show me ] Click on the "Cyclify" button (immediately above the large text box).   [ Show me ] Click on the "Diagnose Formula" button (above Direction :).   [ Show me ] Finish asserting by clicking on the "Back" button of the Formula Diagnosis page   [ Show me ] and then clicking on the "Assert Formula" button (in the top right corner of the main frame of the Assert Formula page).   [ Show me ]

Step Three summary - we have now made a number of interesting assertions on our new constants #$Billy and #$Peter . Maybe you can think of a few more....(For instance, they are both males, surprise surprise!)

Steps Three and Four of this longer version deal with microtheories and where to place assertions in the microtheory hierarchy. Once you have completed steps three and four of this version, you might go back to the shorter version in order to gain a different perspective on microtheories.

Step Four: Testing

In the previous two steps, we created some constants and we made some new assertions. In Step 4, we'll be testing Cyc to make sure that the implications of those new assertions are there. If you have not yet created those new constants and/or assertions, please go back and complete Step 2 and Step 3.

Steps Three and Four of this longer version deal with microtheories and where to place assertions in the microtheory hierarchy. Once you have completed steps three and four of this version, you might go back to the shorter version in order to gain a different perspective on microtheories.

We are not done yet, however! A good engineer does not just design and build things, but also tests those things, to see if they are doing what they are supposed to do. Once again, ontological engineering is no exception.

Question: How does one test an ontology?

Answer: Using the Cyc inference engine!

We will now explore Cyc's question-and-answer functionality. Let's go back to the Tools page and click on "Ask".

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame.   [ Show me ] This will bring up the "Browser Tools" page. Click on the "Ask" link in the column on the left.   [ Show me ] This will bring up the "Ask a Query" page.

As an ontological engineer, having finished making some assertions I will ask myself, what are some things that I would expect Cyc to know based on the information I've just entered? Of course I would expect Cyc to know (isa Billy DomesticPet) and (likesAsFriend Billy Peter) (in the relevant microtheories, of course!) as I explicitly asserted those. But what about something a little less obvious, something that will make Cyc think a bit? ...What could such a question be? What about, say, the fact that Billy takes up space?

Let's ask.

Try it yourself! Enter this into your copy of OpenCyc.    Enter "BiologyMt" in the text box next to "Mt :".   [ Show me ] Enter "(isa Billy SpatialThing)" in the large text box.   [ Show me ] Click on the "Cyclify" button (immediately above the large text box).   [ Show me ] Click on the "Ask Query" button (immediately above the Mt : text box).   [ Show me ]

You should see the following:

Ask a Query

      [Skip to Inputs]

Last query in BiologyMt :
(isa Billy SpatialThing)

Query halted because : Search space was exhausted.

Query was proven True   [Explain]

Yes, Cyc does know that Billy is a spatial thing! How does Cyc know this?

Try it yourself! Enter this into your copy of OpenCyc.    Click on the link "Explain" (immediately above the line that separates the result of the query and the tools for asking another query).   [ Show me ]

This useful tool should produce the following:

Inference Answer Detail   [Refresh]   [Continue Ask]

Query in BiologyMt :
(isa Billy SpatialThing)

One Justification : 
:ISA (isa Billy SpatialThing) in BiologyMt

"ISA:" is what is known as an HL module, a specialized inference-performing module of which Cyc has a great many. Clicking on it provides a summary of the particular inferences the module performed in this case.

Click here for suggested reading on this topic   Tutorial lesson on Inference in Cyc

Try it yourself! Enter this into your copy of OpenCyc.    Click on the link "ISA:", under One Justification :.   [ Show me ]

You should see the following:

HL Support Detail   [Refresh]

Strength : Default   Module : ISA

Mt : BiologyMt
HL Formula : 
(isa Billy SpatialThing)

Justification : 
  (isa Billy Animal) in BiologyMt
  (genls Animal SolidTangibleThing) in TransportationMt
  (genls SolidTangibleThing PartiallyTangible) in NaivePhysicsVocabularyMt
  (genls PartiallyTangible TwoOrHigherDimensionalThing) in BaseKB
  (genls TwoOrHigherDimensionalThing SpatialThing) in BaseKB

Note that, for reasons which should now be obvious, this inference would not produce the same answer if the question was asked in the #$BaseKB . (You may like to verify this yourself...).

Now, just out of interest, let's ask if Billy is a person, and see what happens. (What would you expect to happen?)

Try it yourself! Enter this into your copy of OpenCyc.    Click on the link "Continue Ask" in the upper right hand corner of the Inference Answer Detail page.   [ Show me ] This will bring up the Ask a Query page. Enter "(isa Billy Person)" in the large text box.   [ Show me ] Click on the "Cyclify" button (immediately above the large text box).   [ Show me ]

What microtheory should we ask the question in? Let's try #$HumanActivitiesMt .

Try it yourself! Enter this into your copy of OpenCyc.    Enter "HumanActivitiesMt" in the text box next to "Mt :". Click on the "Ask Query" button (immediately above the Mt : text box).   [ Show me ]

You should see the following:

Ask a Query

      [Skip to Inputs]

Last query in HumanActivitiesMt :
(isa Billy Person)

Query halted because : Search space was exhausted.

Query was not proven

Why didn't Cyc say that this statement was false?

The Cyc inference engine never returns "false" -- but only "true" or "not proven" -- as the answer to a query.

In fact the Cyc inference engine never returns false - only true or not proven. Cyc knows a great deal but has sufficient humility not to assume that its failure to prove an assertion P is a sound basis for concluding that P is false. However, let's try asking (not (isa Billy Person)) , i.e. "Is it not the case that Billy is a person?"

Try it yourself! Enter this into your copy of OpenCyc.    Scroll down below "Query was not proven" on the "Ask a Query" page. The query we just asked is still entered into the fields there. Insert "(not" just before "(isa Billy Person)" and add another ")" at the end of the query, so that you have "(not(#$isa #$Billy #$Person))" entered in the large text box. Click on the "Cyclify" button (immediately above the large text box). Make sure that it still says "HumanActivitiesMt" in the text box next to "Mt :". Click on the "Ask Query" button (immediately above the Mt : text box).

You should see this proven True! Why is this? Click on the link "Explain"....and again click on the link to the ISA: inference module.

Try it yourself! Enter this into your copy of OpenCyc.    Click on the link "Explain" (next to "True" and immediately above the line that separates the result of the query and the tools for asking another query).   [ Show me ] From the "Inference Answer Detail" page, click on the link "ISA:", under One Justification :.   [ Show me ]

You should see something that looks like this:

Mt : HumanActivitiesMt
HL Formula :
(not
   (isa Billy Person))

Justification :
  (isa Billy DomesticPet) in HumanActivitiesMt
  (genls DomesticPet DomesticatedAnimal) in HumanActivitiesMt
  (genls DomesticatedAnimal TameAnimal) in DomesticBreedsVocabularyMt
  (genls TameAnimal NonPersonAnimal) in BiologyVocabularyMt
  (disjointWith Person NonPersonAnimal) in BiologyMt

This provides a summary of the inferencing which the :ISA inference module went through in this case. Can you see what went on? Basically, it followed the genls hierarchy from the collection #$DomesticPet (which Billy belongs to) up to the collection #$NonPersonAnimal . It then found an assertion that the collections #$Person and #$NonPersonAnimal are 'disjoint' - i.e. they have no instances in common (which makes sense, given their names). The module then concluded that since Billy is a member of the collection #$NonPersonAnimal , he cannot be a member of the collection #$Person .

Note that it is not the case that every query which returns "Not Proven" can be made to return "True" when negated. Consider, for example, (isa Billy Dog) . Try asking this both with and without a (not ...) surrounding it.

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame. This will bring up the "Browser Tools" page. Click on the "Ask" link in the column on the left. This will bring up the "Ask a Query" page. Enter "(isa Billy Dog)" in the large text box. Click on the "Cyclify" button (immediately above the large text box). Enter "HumanActivitiesMt" in the text box next to "Mt :". Click on the "Ask Query" button (immediately above the Mt : text box).

Try it yourself! Enter this into your copy of OpenCyc.    Click on the Tools link in the left corner of the top frame. This will bring up the "Browser Tools" page. Click on the "Ask" link in the column on the left. This will bring up the "Ask a Query" page. Enter "(not (isa Billy Dog))" in the large text box. Click on the "Cyclify" button (immediately above the large text box). Enter "HumanActivities" in the text box next to "Mt :". Click on the "Ask Query" button (immediately above the Mt : text box).

It turns out that Cyc cannot prove that Billy is or is not a dog. Cyc does not know enough about Billy to decide either way. Of course if Cyc knew that Billy were a cat then perhaps Cyc could decide this question. Remember that we did not manage to assert that Billy and Peter were cats because there was no #$Cat constant. And of course, the relevant inference would only go through if such a constant were intelligently ontologized.

If you would like to, go ahead and create a constant #$Cat (a collection, of course), assert that Billy and Peter are instances of it, make whatever assertions on it you think are required to capture the meaning of 'cat' and, in particular, make whatever #$disjointWith assertions are required for Cyc to be able to prove that Billy is not a dog. (Make sure you test with an actual 'Ask' to verify!)

Now, if you are up to a challenge, see if you can make whatever #$disjointWith assertions are required for Cyc not to conclude any analogous wrong thing about Billy....:-)

Click here for suggested reading on this topic   Further reading on negation in CycL

What else should we expect Cyc to be able to infer about Billy and Peter?

Here are some suggestions for further Asks:

I encourage you to try doing some other asks, then making some other assertions, then doing still further asks....You are now on your way to becoming a Cyc-savvy ontological engineer. Have fun!!

Steps Three and Four of this longer version deal with microtheories and where to place assertions in the microtheory hierarchy. Once you have completed steps three and four of this version, you might go back to the shorter version in order to gain a different perspective on microtheories.

Step four summary - we have performed some inference-testing and found out that Cyc does not only know what we told it in Step 3, it is able to make certain inferences based on that knowledge, which shows that it has integrated that knowledge into the larger KB.


Last update: 08/28/2002    |    Copyright © 2002 Cycorp All rights reserved.