A discussion on defrange and defset in PAL

Bill Grosso

So what's the syntax for defrange ? There are actually 5 distinct

types defrange statements. They all have the form:



         (defrange [variable] [type] [type-specific information])



[variable] is simply a local or global variable name. [type] is one of

:SET,:FRAME, :INTEGER, :STRING, :SYMBOL, :NUMBER and {refinement}

depends

on the type



There are two possible defranges using :SET as a value for [type]



         (defrange variable :SET [setname])

         (defrange variable :SET [setname] [slotname])



That is, you must specify the set the variable is ranging over. And,

optionally, you can specify a slot. The meaning of the second form

is "all elements of this set which are values for the specified

slot"



:FRAME is exactly parallel to :SET (not surprising, since "class"

is really just a strange way of spelling "set").



         (defrange variable :FRAME [classname])

         (defrange variable :FRAME [classname])[slotname])



The first is simply "instances of the named class" and the second

is "instances of the named class which are values of the

specified slot.



The final 4 types require a slot (because the implied binding spaces

would otherwise be infinite). So, for example.



         (defrange variable :INTEGER [slotname])



This means "all integers which are values of that slot." Which is

marginally cool in a reifed-slots sort of way. For example:



         (defrange %height :INTEGER height)

         (forall %height (> %height 0))



constrains the integer values of the slot height wherever it happens

to be attached. All future users of this slot, in either the current kb,

or in any kb that includes it, are constrained !

--------------



--------------

A discussion of defrange leads immediately to a discussion of

defset. The immediate question is, of course, "What's a set ?"



The answer is that a set is simply an enumerated list of things. You

use one of the following forms for defset



         (defset [setname] :FRAME [list of frame names])

         (defset [setname] :INTEGER [list of integers])

         (defset [setname] :STRING [list of strings])

         (defset [setname] :SYMBOL [list of symbols])

         (defset [setname] :NUMBER [list of numbers])



And then you can have variables range over the set.





element-of is a two-place predicate involving a term and a set.

It is of the form



         (element-of [term] [set])



And the only real use case is when the term is either a variable or a

function involving a variable. So, for example, you might write the

following constraint



         (defset Swedish-Male-First-Names :STRING Lars Erik Bjorn)

         (defrange ?person :FRAME Person)



         (forall ?person (=>

                      (and (= (country  ?person) Sweden) (sex ?person

"male"))

                      (element-of (first-name ?person)

Swedish-First-Names)

         )



(roughly "All swedish men have a first name of either Lars, Erik or

Bjorn")

--------------



--------------

The way to think about defset is that it gives you the ability

to make arbitrary "and no more" statements about your ontology.

So, for example, borrowing an example from Austin's most

incomprehensible ontology:



         (defset BaseClasses IntangibleThing PartiallyIntangibleThing

                 PartiallyTangibleThing TangibleThing)

         (defrange ?baseClass :SET BaseClasses)

         (defrange ?baseClass2 :SET BaseClasses)

         (defrange ?frame :FRAME :THING)



         (forall ?frame

                 (or

                         (exists ?baseClass (instance-of ?frame

?baseClass))

                         (= ?frame :THING)

                 )

         )

         (forall ?frame (exists ?baseClass (exists ?baseClass2

                 (=>     (and    (instance-of ?frame ?baseClass)

                                 (instance-of ?frame ?baseClass2)

                         )

                         (= ?baseClass ?baseClass2)

                 )

         )



What this states, in an intensional way, is that the BaseClasses

are almost a complete partition of the knowledge base-- everything

(except for :THING) is an instance of exactly one of them.