• Jueves 28 de Marzo de 2024, 17:29

Autor Tema:  Implementacion De Laberinto En Prolog  (Leído 10698 veces)

noqueteden

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Implementacion De Laberinto En Prolog
« en: Viernes 20 de Mayo de 2005, 16:19 »
0
Hola. Estoy atareado en la implementación de un laberinto en Prolog.
Agradeceria comentarios, idea y sugerencias. Quizas pudiera orientarme codigo fuente sobre algo parecido.
He decidido comenzar por la representación del laberinto y el explorador que debe salir del mismo.
Una de mis dudas es que he de situar de forma aleatoria el explorador en el laberinto y la salida, es decir, en cada ejecución la ubicación del explorador y de la salida es decidida de forma arbitraria(aleatoria) por el programa.

Espero vuestras respuestas.


Muchas gracias.

fuhrer

  • Miembro MUY activo
  • ***
  • Mensajes: 329
  • Nacionalidad: mx
    • Ver Perfil
    • http://admin.busquenoseninternet.com
Re: Implementacion De Laberinto En Prolog
« Respuesta #1 en: Viernes 20 de Mayo de 2005, 22:06 »
0
Hola que tal.

Esto lo puedes hacer como si simularas una matriz, ya que vas a establecer donde habra muros u otras cosas, sólo avanzaras a la izquierda o derecha, así qie debes tener 2 variable, también puedes ir poniendo marcas por sonde ya pasaste, para no volver a pasar por el mismo lado, exepto en el caso de que no alla otro lado a donde ir y no hllas encontrado la salida, podras pasar por el mismo lado, te recomiendo que esas marcas sean número ya que necesitaras pasar varias veces por un mismo lugar, esto es por si debes de elegir a donde ir, eligiras la que tenga un número más pequeño.

Espero me entiendas lo que te digo, si no, avisame, para que te de un programa que simula la recolleción de basura de un robot, tal vez te sirva.

Hasta luego.

noqueteden

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Implementacion De Laberinto En Prolog
« Respuesta #2 en: Lunes 23 de Mayo de 2005, 01:10 »
0
Muchas gracias por la idea. Es interesante. Por cierto necesito generar aleatoriamente la ubicacion de inicio del explorador y la de la salida, ademas de ciertos objetos ubicados en parte del camino. Agradeceria un ejemplo de sencillo de como plasmar eso a nivel de codigo(reglas y hechos).
Muchas gracias anticipadas.

Un saludo.

fuhrer

  • Miembro MUY activo
  • ***
  • Mensajes: 329
  • Nacionalidad: mx
    • Ver Perfil
    • http://admin.busquenoseninternet.com
Re: Implementacion De Laberinto En Prolog
« Respuesta #3 en: Martes 24 de Mayo de 2005, 01:43 »
0
Hola de nuevo.

Si lo piensas hacer simulando una matríz, lo que debes hacer para una inicialización aleatoria es algo como esto:
Código: Text
  1.  
  2. :-dynamic entrada/2.
  3. :-dynamic salida/2.
  4. :-dynamic objeto1/2.
  5. ...
  6. :-dynamic objeton/2.
  7. inicia(X,Y):-
  8.          random(0,X,X1),
  9.          random(0,Y,Y1),
  10.          assert(entrada(X1,Y1)),
  11.          random(0,X,X1),
  12.          random(0,Y,Y1),
  13.          assert(salidada(X1,Y1)).
  14.  
  15.  
y así sucesivamente para lo que desees añadir, si vas a tener varios objetos del mismo tipo, entonces solo es suficiente con que hagas una rutina que te inicialice varios a la vez para no introducir uno por uno.

Como podras ver, el uso de dynamic es para que puedas generar tus posiciones aleatoias, y con assert las inicializas.

Espero lo entiendas.

Hasta luego.

noqueteden

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Implementacion De Laberinto En Prolog
« Respuesta #4 en: Viernes 27 de Mayo de 2005, 03:35 »
0
Es una buena idea. Muchas gracias. He intentado modelar tu idea de esta forma:
____________________________________________________________________

%asignacion de valor-literal de la fruta(la pera es 0,el limon es 1,...)
fruta(0,pera).
fruta(1,limon).
fruta(2,kiwi).
fruta(3,lima).
fruta(4,coco).
fruta(5,fresa).
fruta(6,melon).

:-
%inicializacion de los booleanos para saber si una fruta se ha usado ya o no
retractall(usado(_,_)),
assert(usado(0,0)),
assert(usado(1,0)),
assert(usado(2,0)),
assert(usado(3,0)),
assert(usado(4,0)),
assert(usado(5,0)),
assert(usado(6,0)),
%inicializacion de las "casillas"(numero(_,_,_))
retractall(numero(_,_,_)),
assert(numero(0,0,nada)),
assert(numero(0,1,nada)),
assert(numero(0,2,nada)),
assert(numero(0,3,nada)),
assert(numero(1,0,nada)),
assert(numero(1,1,nada)),
assert(numero(1,2,nada)),
assert(numero(1,3,nada)),
assert(numero(2,0,nada)),
assert(numero(2,1,nada)),
assert(numero(2,2,nada)),
assert(numero(2,3,nada)),
assert(numero(3,0,nada)),
assert(numero(3,1,nada)),
assert(numero(3,2,nada)),
assert(numero(3,3,nada)).

%deberia asignar las 7 frutas que existen en 7 "casillas" al azar.
genera(A) :-       A > 0,
                   random(0,3,X),
                   random(0,3,Y),
                   numero(X,Y,nada),
                   dame_fruta(J),
                   retract(numero(X,Y,nada)),
                   fruta(J,D),
                   assert(numero(X,Y,D)),
                   B is A-1,
                   genera(B).

%devuelve aleatoriamente una fruta no usada hasta el momento                  
dame_fruta(J) :-  aleatorio_fruta(J),
                           retract(usado(J,0)),
                           assert(usado(J,1)).

%devuelve una fruta no usada              
aleatorio_fruta(J) :- alea(J),no_usado(J).

%genera al azar un valor entre 0 y 6(posibles valores de las frutas)
alea(J) :- random(0,6,J).

%indica si un elemento de "usado" es 0(no usado)
no_usado(J) :- usado(J,0).

%mostrar por pantalla aquellas posiciones que contienen frutas                  
muestra(A,B,J) :-  fruta(_,J),
                            numero(A,B,J).


%la ejecución por consola deberia ser:
%?- [ej].
%?- genera(7).
%?- muestra(A,B,J).
%Tras lo cual se deberian suceder 7 posiciones de "casillas"(numero(_,_,_))
%con un valor de fruta distinto cada una de ellas.
____________________________________________________________________


El problema es que cuando se genera aleatoriamente un valor para tomar una fruta y esta ya ha sido usada(usado(C,1)) se devuelve falso y por tanto se interrumpe el proceso de asignacion de frutas a "casillas"(numeros).

¿De qué forma podría solucionarlo?

Agradeciendo la respuesta, envio un saludo.

noqueteden

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Implementacion De Laberinto En Prolog
« Respuesta #5 en: Viernes 27 de Mayo de 2005, 03:36 »
0
Es una buena idea. Muchas gracias. He intentado modelar tu idea de esta forma:

Código: Text
  1.  
  2. %asignacion de valor-literal de la fruta(la pera es 0,el limon es 1,...)
  3. fruta(0,pera).
  4. fruta(1,limon).
  5. fruta(2,kiwi).
  6. fruta(3,lima).
  7. fruta(4,coco).
  8. fruta(5,fresa).
  9. fruta(6,melon).
  10.  
  11. :-
  12. %inicializacion de los booleanos para saber si una fruta se ha usado ya o no
  13. retractall(usado(_,_)),
  14. assert(usado(0,0)),
  15. assert(usado(1,0)),
  16. assert(usado(2,0)),
  17. assert(usado(3,0)),
  18. assert(usado(4,0)),
  19. assert(usado(5,0)),
  20. assert(usado(6,0)),
  21. %inicializacion de las "casillas"(numero(_,_,_))
  22. retractall(numero(_,_,_)),
  23. assert(numero(0,0,nada)),
  24. assert(numero(0,1,nada)),
  25. assert(numero(0,2,nada)),
  26. assert(numero(0,3,nada)),
  27. assert(numero(1,0,nada)),
  28. assert(numero(1,1,nada)),
  29. assert(numero(1,2,nada)),
  30. assert(numero(1,3,nada)),
  31. assert(numero(2,0,nada)),
  32. assert(numero(2,1,nada)),
  33. assert(numero(2,2,nada)),
  34. assert(numero(2,3,nada)),
  35. assert(numero(3,0,nada)),
  36. assert(numero(3,1,nada)),
  37. assert(numero(3,2,nada)),
  38. assert(numero(3,3,nada)).
  39.  
  40. %deberia asignar las 7 frutas que existen en 7 "casillas" al azar.
  41. genera(A) :-       A > 0,
  42.                    random(0,3,X),
  43.                    random(0,3,Y),
  44.                    numero(X,Y,nada),
  45.                    dame_fruta(J),
  46.                    retract(numero(X,Y,nada)),
  47.                    fruta(J,D),
  48.                    assert(numero(X,Y,D)),
  49.                    B is A-1,
  50.                    genera(B).
  51.  
  52. %devuelve aleatoriamente una fruta no usada hasta el momento                  
  53. dame_fruta(J) :-  aleatorio_fruta(J),
  54.                            retract(usado(J,0)),
  55.                            assert(usado(J,1)).
  56.  
  57. %devuelve una fruta no usada              
  58. aleatorio_fruta(J) :- alea(J),no_usado(J).
  59.  
  60. %genera al azar un valor entre 0 y 6(posibles valores de las frutas)
  61. alea(J) :- random(0,6,J).
  62.  
  63. %indica si un elemento de "usado" es 0(no usado)
  64. no_usado(J) :- usado(J,0).
  65.  
  66. %mostrar por pantalla aquellas posiciones que contienen frutas                  
  67. muestra(A,B,J) :-  fruta(_,J),
  68.                             numero(A,B,J).
  69.  
  70.  
  71. %la ejecución por consola deberia ser:
  72. %?- [ej].
  73. %?- genera(7).
  74. %?- muestra(A,B,J).
  75. %Tras lo cual se deberian suceder 7 posiciones de "casillas"(numero(_,_,_))
  76. %con un valor de fruta distinto cada una de ellas.
  77.  
  78.  


El problema es que cuando se genera aleatoriamente un valor para tomar una fruta y esta ya ha sido usada(usado(C,1)) se devuelve falso y por tanto se interrumpe el proceso de asignacion de frutas a "casillas"(numeros).

¿De qué forma podría solucionarlo?

Agradeciendo la respuesta, envio un saludo.

fuhrer

  • Miembro MUY activo
  • ***
  • Mensajes: 329
  • Nacionalidad: mx
    • Ver Perfil
    • http://admin.busquenoseninternet.com
Re: Implementacion De Laberinto En Prolog
« Respuesta #6 en: Viernes 27 de Mayo de 2005, 20:56 »
0
Me imagino que es aquí donde se detiene.
Código: Text
  1.  
  2. genera(A) :-       A > 0,
  3.                   random(0,3,X),
  4.                   random(0,3,Y),
  5.                   numero(X,Y,nada),
  6.                   dame_fruta(J),
  7.                   retract(numero(X,Y,nada)),
  8.                   fruta(J,D),
  9.                   assert(numero(X,Y,D)),
  10.                   B is A-1,
  11.                   genera(B).
  12.  
  13.  
entonces lo que deberias hacer es agregar:
Código: Text
  1.  
  2. genera(A) :-
  3.              A > 0,
  4.               genera(A).
  5.  
  6.  
con esto garantizas a que vuelva a entrar e intente obtener otra fruta, hasta que el valor de A sea menor o igual a cero.

Hasta luego.