Sábado 21 de Diciembre de 2024, 17:19
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Específica
»
Otros temas específicos
»
Programación Lógica
»
Implementacion De Laberinto En Prolog
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Implementacion De Laberinto En Prolog (Leído 10826 veces)
noqueteden
Nuevo Miembro
Mensajes: 4
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.
Tweet
fuhrer
Miembro MUY activo
Mensajes: 329
Nacionalidad:
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.
Tienda México
Busquenos En Internet
Tuxiber
noqueteden
Nuevo Miembro
Mensajes: 4
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:
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
:-dynamic entrada/2.
:-dynamic salida/2.
:-dynamic objeto1/2.
...
:-dynamic objeton/2.
inicia(X,Y):-
random(0,X,X1),
random(0,Y,Y1),
assert(entrada(X1,Y1)),
random(0,X,X1),
random(0,Y,Y1),
assert(salidada(X1,Y1)).
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.
Tienda México
Busquenos En Internet
Tuxiber
noqueteden
Nuevo Miembro
Mensajes: 4
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(
.
%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
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
%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.
fuhrer
Miembro MUY activo
Mensajes: 329
Nacionalidad:
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
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).
entonces lo que deberias hacer es agregar:
Código: Text
genera(A) :-
A > 0,
genera(A).
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.
Tienda México
Busquenos En Internet
Tuxiber
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Específica
»
Otros temas específicos
»
Programación Lógica
»
Implementacion De Laberinto En Prolog