2012-06-29 7 views
2

Salut j'ai ce problème que je ne peux pas résoudre. Je suis une recrue Prolog et j'ai vu une tonne de ces exemples d'arbres généalogiques, mais aucun ne semble résoudre mon problème.Boucles non bouclées boucles

Dire que j'ai

son(X, Y) :- 
    \+daughter(X, Y), 
    father(Y, X). 

father(Y, X) :- 
    male(X), 
    son(X, Y). 

et je l'appelle l'un d'entre eux, il va et vient entre les conditions parce que chacun satisferait le précédent, ce qui entraîne donc une erreur de pile locale.

La plupart semblent recommander la suppression de l'une des définitions, mais je dois répondre aux requêtes père et fils. S'il vous plaît, aidez, cela semble si simple, mais je ne peux pas le comprendre. Comment puis-je me casser après une boucle une fois?

TIA

Répondre

2

Vous pouvez:

1), vous pouvez utiliser un prédicat d'emballage:

father(Y,X):- 
    male(X), 
    son_data(X,Y). 

son(X,Y):- 
    son_data(X,Y). 
son(X,Y):- 
    \+daughter(X, Y), 
    father(Y, X). 

votre base de données devrait ressembler

son_data(mike,steph). 
.... 
father(nick,john). 
.... 

(pas de fils/2 entrées

2) utiliser une version prologue prenant en charge tabling (telle que XSB) (ou l'implémenter; pas une si bonne idée dec)

+0

merci! très utile –