Está en la página 1de 2

domains

% estado(puerta,piso,lista de requerimientos)
estado=estado(symbol,integer,listapisos).
listaestados=estado*.
listapisos=integer*.

predicates

nondeterm pertenece(estado,listaestados)
nondeterm mover(integer,estado,estado)
% pp(estado inicial,estado final,control de profundidad,lista final,lista ya visitados,ultimo piso)
nondeterm pp(estado,estado,integer,listaestados,listaestados,integer)
nondeterm imprimirestados(listaestados)
nondeterm imprime(estado)
clauses

/************************** CONJUNTO DE REGLAS DE PRODUCCION ***********************************/

% Incorpora el ultimo piso a la lista


mover(ULTPISO,estado(abierta,PISO1,[_]),estado(cerrada,PISO1,[ULTPISO])).

% Sube de a un piso
mover(_,estado(cerrada,PISO1,[PISODESTINO|CO]),estado(cerrada,PISO2,[PISODESTINO|CO])):-
PISO1<PISODESTINO,PISODESTINO<=10,PISO1>=-2,PISO2=PISO1+1.

% Baja de a un piso
mover(_,estado(cerrada,PISO1,[PISODESTINO|CO]),estado(cerrada,PISO2,[PISODESTINO|CO])):-
PISO1>PISODESTINO,PISODESTINO>=-2,PISO1<=10,PISO2=PISO1-1.

% Cierra la puerta si llegó a un piso (obligatorio)


mover(_,estado(abierta,PISO,[PISO|CO]),estado(cerrada,PISO,CO)).

% Cierra la puerta si estaba abierta (depende del estado inicial)


mover(_,estado(abierta,PISO,[PISODESTINO|CO]),estado(cerrada,PISO,[PISODESTINO|CO])).

% Abre la puerta si estaba cerrada (depende del estado final)


mover(_,estado(cerrada,PISO,[PISO]),estado(abierta,PISO,[])).

% Abre la puerta si llegó a un piso


mover(_,estado(cerrada,PISO,[PISO|CO]),estado(abierta,PISO,[PISO|CO])).

/**************************************ESTRATEGIA DE CONTROL*************************************/

% Determina el fin de los movimientos


pp(E,E,_,[E],_,_):-!.

% Llama a los distintos movimientos


pp(EI,EF,LEVEL,[EI|R],YV,Ultpiso):- LEVEL>0,
LEVEL2=LEVEL-1,mover(Ultpiso,EI,E2),not(pertenece(E2,YV)),pp(E2,EF,LEVEL2,R,[E2|YV],Ultpiso).

% Verifica pertenencia de estado en lista


pertenece(E,[E|_]).
pertenece(E,[_|CO]):-pertenece(E,CO).

% Imprime los distintos estados del ascesor


imprimirestados([EI|E2]):-imprime(EI),imprimirestados(E2).
imprimirestados([]).

imprime(estado(abierta,PISO1,[PISO2|_])):-PISO1<>PISO2,write("La puerta se encuentra abierta en el piso inicial: ",PISO1,"\n"),


write("La puerta se cierra en el piso inicial: ",PISO1,"\n").

imprime(estado(abierta,PISO,[PISO|_])):-write("Se abre la puerta del ascensor en el piso: ",PISO,"\n"),


write("Se cierra la puerta del ascensor en el piso: ",PISO,"\n").

imprime(estado(cerrada,PISO,[_|_])):-write(PISO,"\n").
imprime(estado(_,_,[])).

goal
L=[0,4,6,1,6,10],
/*********************************BASE DE DATO GLOBAL**********************************************/

/**INICIAL**************FINAL********************RESULTADO*****************************************/
pp(estado(cerrada,0,L),estado(cerrada,10,[]),50,LISTARESULT,[estado(cerrada,0,L)],10),
imprimirestados(LISTARESULT).

También podría gustarte