1 votos

Stack Overflow en Prolog

Estoy tratando de escribir un código Prolog para determinar si la variable vinculada X está en el ámbito de la variable vinculada Y en una lista. Las listas pueden estar anidadas y X está en el ámbito de Y si X y Y son miembros de la misma lista o si X es miembro de una lista que es miembro de una lista que es miembro de una lista... (anidada indefinidamente) que está en la misma lista que Y . Aquí defino in_scope(X,Y,List) para significar que X está en el ámbito de Y en la lista más externa List . He escrito el siguiente código, pero este código resulta en un desbordamiento de pila:

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).

Agradecería que me ayudaran a modificar el código para evitar el desbordamiento de pila.

1voto

larsmans Puntos 167484

Me ha dado pereza rastrear el error real, pero el siguiente código simplificado

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).

da los resultados previstos:

?- 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.

Pero tenga en cuenta lo siguiente; no estoy seguro de si este es el comportamiento previsto:

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X