Second-order Predicates

Predicates and Denotational Functions

Now, let’s talk a little more about predicates and go into further details.

Second-Order Predicates

Sometimes we want to make a statement about a predicate itself, or even relate two predicates to each other.  To do so requires the use of a special kind of predicate, loosely called a “second-order predicate.”  A second-order predicate is one which can be applied, not only to individual objects, but also to relations themselves.  Some of the example predicates already discussed in this tutorial are second-order predicates.  For example, #$arg1Isa relates a predicate to a certain collection, so it’s a second-order predicate.  Refer to the #$arity predicate example on the slide.  In this example, #$arity relates  the predicate, #$mother, to the term, 2.  #$isa is also a second-order predicate because it relates something to a collection that the thing belongs to.  Some collections are collections of predicates.  For example, if we say (#$isa #$mother #$BinaryPredicate), #$isa is being used to relate the predicate, #$mother, to a certain collection, #$BinaryPredicate.  #$isa is a second-order predicate in this sense.

There are special second-order predicates that always relate predicates to each other.  #$isa can relate all sorts of different things to each other and sometimes it relates predicates to collections of predicates.  In that sense, #$isa is used in a second-order way.  However, there are some second-order predicates which are always used to relate predicates to each other.  We’re going to discuss four of them: #$genlPreds, #$genlInverse, #$negationPreds, and #$negationInverse.

#$genlPreds

Predicates relate to each other within a structure of predicates in Cyc.  We can think of this structure as a hierarchy, because some predicates are more general than others.  The first special predicate we’re going to look at is called #$genlPreds.  Let’s look at its definition.  #$genlPreds is a binary (#$arity = 2) predicate which takes a predicate as both its first and second arguments. If we apply #$genlPreds to two predicates (represented on the slide as the variables  ?NARROW-PRED and ?WIDE-PRED), then the first argument, ?NARROW-PRED, is a restricted version of the second argument, ?WIDE-PRED.  In other words, any arguments of which the ?NARROW predicate is true, are also arguments of which the ?WIDE predicate is true.  We’ll look at some specific examples in the following slides, but first note that predicates of any arity may be related with #$genlPreds provided that both predicates have the same arity.

#$genlPreds

  In the first example on the slide, the predicate #$biologicalMother is related, by #$genlPreds, to the predicate #$biologicalParents.  This means that if x is the biological mother of y, then x is also a biological parent of y.  So, as you can see, #$biologicalMother is just a more restricted, or narrower, version of the predicate, #$biologicalParents.

In the second example on the slide, #$genlPreds holds between the predicate #$createdBy and the predicate #$startsAfterStartingOf.  In other words, if x is created by y, then x starts (or x begins to exist) after y begins to exist.  This says that the creator of something has to exist before the creation exists.

#$genlInverse

  Let’s now consider another second-order predicate, #$genlInverse.  It’s similar to #$genlPreds, but it has a twist.  By stating that #$genlInverse holds between two predicates, we’re saying that the first predicate, which relates argument a to argument b,  is a narrower version of the second predicate, which usually relates argument a to argument b, but #$genlInverse reverses the order to argument b related to argument a.  So if the narrower predicate holds between arguments a and b, the wider predicate holds between arguments b and a, in that order.

#$genlInverse

  How would we express that in a rule, say with an #$implies statement (assume the arity for both predicates is 2)?

#$genlInverse

  If ?NARROW-PRED relates argument 1 and argument 2, then ?WIDE-PRED-INV relates the inverse argument set, or argument 2 and argument 1.

With #$genlInverse, the two predicates you’re relating have to be binary predicates.  You’ll remember with #$genlPreds they could be any arity as long as they were the same.  So this is a little more restricted.

Let’s look at one specific example, there at the bottom of the slide.  This says that the predicate, #$customers, is related by #$genlInverse to the predicate, #$suppliers.  This means that if a is a customer of b, then b is a supplier to a.

#$negationPreds

  The third second-order predicate is called #$negationPreds. If this predicate is applied to two predicates (P1 and P2) and P1 holds for a certain set of arguments (a1, a2, ..., aN), then P2 does not hold for P1's argument set.  Similar to #$genlPreds, the two predicates related by #$negationPreds can be of any arity, as long as they are both of the same arity.

The last line on the slide is an example of a sentence using #$negationPreds to relate #$owns to #$rents.  This says that if a owns b, then it’s not the case that a rents b; you can’t both own and rent a given thing at the same time.

(Note: the predicate #$rents means “rents from someone,” not “rents to someone.”)

#$negationInverse

  The final second-order predicate we’ll discuss is #$negationInverse.  You can think of this predicate as an equivalent to the combination of #$genlInverse and #$negationPreds. That is, if #$negationInverse is applied to two
predicates and the first predicate holds for two arguments, then it's not the case that the second predicate will hold for the same two arguments in reverse argument order.  Similar to #$genlInverse, the two predicates being related both have to be binary.

The Example in the last line on the slide is interesting because #$negationInverse takes #$subordinates and relates it to itself.  If we take a closer look at the meaning of this sentence, we see that if a is a subordinate of b, then it is not the case that b is a subordinate of a.  Thus, any binary predicate which is asymmetric will be related by #$negationInverse to itself, because that’s just another way of saying that a predicate is asymmetric.  In fact, if you look at the extension of  #$negationInverse in the KB (Knowledge Base), you’ll find that most of the cases represented in the KB involve relating a predicate to itself (of course those are the asymmetric ones).

Summary

 This concludes the lesson on second-order predicates.