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!