2010-10-23 8 views
1

Je suis en train d'écrire du code Prolog pour déterminer si la variable est liée X dans le cadre de la variable liée Y dans une liste. Les listes peuvent être imbriquées et X est dans le champ Y si X et Y sont membres de la même liste ou si X est membre d'une liste qui est membre d'une liste qui est membre d'une liste ... (imbriquées indéfiniment) qui se trouve dans la même liste que Y. Ici, je in_scope(X,Y,List) définis signifie que X est dans le champ d'application de Y dans la liste extérieure List. J'ai écrit le code suivant, mais ce code se traduit par un débordement de pile:débordement de pile dans Prolog

in_scope(X,Y,List) :- in(Parent,List), member(X,Parent), member(Y,Parent). 
in_scope(X,Y,List) :- in(X,Parent), in_scope(Parent,Y,List). 

in(X,Y) :- member(X,Y). 
in(X,Y) :- member(X,Z), in(Z,Y). 

Je vous serais reconnaissant de l'aide à modifier le code pour éviter le débordement de la pile.

Répondre

1

j'étais trop paresseux pour tracer l'erreur réelle, mais ce qui suit, le code simplifié

in_scope(X,Y,List) :- member(Y,List), in(X,List). 
in_scope(X,Y,List) :- member(Sub,List), in_scope(X,Y,Sub). 

in(X,List) :- member(X,List). 
in(X,List) :- member(Sub,List), in(X,Sub). 

donne les résultats escomptés:

?- in_scope(x,z,[x,y,z]). 
true . 

?- in_scope(x,z,[[x,y],z]). 
true . 

?- in_scope(x,z,[[[[[x],y]],z]]). 
true . 

?- in_scope(x,a,[[[[[x],y]],z]]). 
false. 

Mais notez ce qui suit; Je ne suis pas sûr si c'est le comportement prévu:

?- in_scope(x,x,[x]). 
true . 
+0

Merci! Et 'in_sublist (X, Sub)' devrait-il être 'in (X, Sub)'? – sentinel

+0

Oui, mes excuses. J'avais renommé le prédicat, puis l'ai renommé. –

+0

De rien. J'ai trouvé au moins un bug dans le prédicat 'in/2'. Changer les noms des variables pour quelque chose d'intelligible a beaucoup aidé :) –

Questions connexes