next up previous
Next: License agreement Up: Guide Previous: Commands

A marvellous example

We will study the domain of the family relationships. The system will deduce relations such as cousin based on basic relations, such as, parent and child.

We will define the following predicates :

	
   parent(X,Y)   -> X is parent of Y
   child(X,Y)    -> X is son of Y or X is daughter of Y
   brosis(X,Y) -> X is brother of Y, or X is sister of Y
   grandparent(X,Y)  -> X is grandparent of Y
   unaunt(X,Y)     -> X is uncle of Y or X is aunt of Y
   cousin(X,Y)   -> X is cousin of Y

Our axioms are :

    parent(X,Y)^parent(Y,Z)->grandparent(X,Z)
    child(Z,X)^parent(X,Y)->brosis(Y,Z)
    parent(X,Y)^brosis(X,Z)->unaunt(Z,Y)
    parent(X,Y)^brosis (X,Z) ^ parent (Z,T) -> cousin (Y,T)
    brosis(X,Y)->brosis(Y,X)
The Knowledge Base (KB) begins like this:

   >>list
    brosis(X,Y) -> brosis(Y,X)
    parent(X,Y) ^ brosis(X,Z) ^ parent(Z,T) -> cousin(Y,T)
    parent(X,Y) ^ brosis(X,Z) -> unaunt(Z,Y)
    child(Z,X) ^ parent(X,Y) -> brosis(Y,Z)
    parent(X,Y) ^ parent(Y,Z) -> grandparent(X,Z)

First, we introduce:

   >>save parent(juan,rocio)
    Number of new clausules in K.B.:1

   >>save parent(juan,jose)
    Number of new clausules in K.B.:1

   >>save parent(juan,pepe)
    Number of new clausules in K.B.:1

   >>save parent(maria,rocio)
    Number of new clausules in K.B.:1

   >>save parent(maria,jose)
    Number of new clausules in K.B.:1

   >>save parent(maria,pepe)
    Number of new clausules in K.B.:1

Listing the K.B. like this :

 >>list
    parent(maria,pepe)
    parent(maria,jose)
    parent(maria,rocio)
    parent(juan,pepe)
    parent(juan,jose)
    parent(juan,rocio)
    brosis(X,Y) -> brosis(Y,X)
    parent(X,Y) ^ brosis(X,Z) ^ parent(Z,T) -> cousin(Y,T)
    parent(X,Y) ^ brosis(X,Z) -> unaunt(Z,Y)
    child(Z,X) ^ parent(X,Y) -> brosis(Y,Z)
    parent(X,Y) ^ parent(Y,Z) -> grandparent(X,Z)

Now we introduce child(pepe,juan):

   >>save child(pepe,juan) 
    Number of new clausules in K.B.:6

   >>list
    brosis(pepe,pepe)
    brosis(pepe,jose)
    brosis(jose,pepe)
    brosis(pepe,rocio)
    brosis(rocio,pepe)
    child(pepe,juan)
    parent(maria,pepe)
    parent(maria,jose)
    parent(maria,rocio)
    parent(juan,pepe)
    parent(juan,jose)
    parent(juan,rocio)
    brosis(X,Y) -> brosis(Y,X)
    parent(X,Y) ^ brosis(X,Z) ^ parent(Z,T) -> cousin(Y,T)
    parent(X,Y) ^ brosis(X,Z) -> unaunt(Z,Y)
    child(Z,X) ^ parent(X,Y) -> brosis(Y,Z)
    parent(X,Y) ^ parent(Y,Z) -> grandparent(X,Z)

You can see that new relations appear. Notice the limitations of a system which does not handle equality.

The next relationship is parent(rocio,alberto):

   >>save parent(rocio,alberto)
    Number of new clausules in K.B.:4
 
   >>list
    unaunt(pepe,alberto)
    grandparent(maria,alberto)
    grandparent(juan,alberto)
    parent(rocio,alberto)
    brosis(pepe,pepe)
    brosis(pepe,jose)
    brosis(jose,pepe)
    brosis(pepe,rocio)
    brosis(rocio,pepe)
    child(pepe,juan)
    parent(maria,pepe)
    parent(maria,jose)
    parent(maria,rocio)
    parent(juan,pepe)
    parent(juan,jose)
    parent(juan,rocio)
    brosis(X,Y) -> brosis(Y,X)
    parent(X,Y) ^ brosis(X,Z) ^ parent(Z,T) -> cousin(Y,T)
    parent(X,Y) ^ brosis(X,Z) -> unaunt(Z,Y)
    child(Z,X) ^ parent(X,Y) -> brosis(Y,Z)
    parent(X,Y) ^ parent(Y,Z) -> grandparent(X,Z)

Finally:

   >>save brosis(jose,rocio)
    Number of new clausules in K.B.:3

   >>save parent(jose,david)
    Number of new clausules in K.B.:7

   >>list
    cousin(david,alberto)
    cousin(alberto,david)
    unaunt(rocio,david)
    unaunt(pepe,david)
    grandparent(maria,david)
    grandparent(juan,david)
    parent(jose,david)
    unaunt(jose,alberto)
    brosis(rocio,jose)
    brosis(jose,rocio)
    unaunt(pepe,alberto)
    grandparent(maria,alberto)
    grandparent(juan,alberto)
    parent(rocio,alberto)
    brosis(pepe,pepe)
    brosis(pepe,jose)
    brosis(jose,pepe)
    brosis(pepe,rocio)
    brosis(rocio,pepe)
    child(pepe,juan)
    parent(maria,pepe)
    parent(maria,jose)
    parent(maria,rocio)
    parent(juan,pepe)
    parent(juan,jose)
    parent(juan,rocio)
    brosis(X,Y) -> brosis(Y,X)
    parent(X,Y) ^ brosis(X,Z) ^ parent(Z,T) -> cousin(Y,T)
    parent(X,Y) ^ brosis(X,Z) -> unaunt(Z,Y)
    child(Z,X) ^ parent(X,Y) -> brosis(Y,Z)
    parent(X,Y) ^ parent(Y,Z) -> grandparent(X,Z)

The final K.B. is:

    cousin(david,alberto)
    cousin(alberto,david)
    unaunt(rocio,david)
    unaunt(pepe,david)
    unaunt(jose,alberto)
    unaunt(pepe,alberto)
    grandparent(maria,david)
    grandparent(juan,david)
    grandparent(maria,alberto)
    grandparent(juan,alberto)
    brosis(rocio,jose)
    brosis(pepe,pepe)
    brosis(pepe,jose)
    brosis(jose,pepe)
    brosis(pepe,rocio)
    brosis(rocio,pepe)

Now, in order to show how the backward-chaining mechanism works, and having the next KB:

   >>list
    parent(isa,david)
    brosis(isa,jose)
    parent(jose,antonio)
    parent(X,Y) ^ brosis(X,Z) ^ parent(Z,T) -> cousin(Y,T)
    parent(X,Y) ^ brosis(X,Z) -> unaunt(Z,Y)
    child(Z,X) ^ parent(X,Y) -> brosis(Y,Z)
    parent(X,Y) ^ parent(Y,Z) -> grandparent(X,Z)

Let's see, the command proof:

   >>proof cousin(david,antonio)
    { [ jose <- Z ],[ isa <- X ],[ david <- Y ],[ antonio <- T ] }

   >>proof unaunt(jose,david)
    { [ isa <- X ],[ jose <- Z ],[ david <- Y ] }

And finally, we exit from LFIAML:

   >>exit
    Goodbye!



David E. Losada Carril
Thu Oct 10 11:33:47 MET 1996