Acciones

Diferencia entre revisiones de «Relación 3 (2)»

De Lógica computacional y teoría de modelos (2019-20)

(Página creada con «<source lang = "prolog"> % Ejercicio de planificación: los siguientes predicados describen un % "mundo" que representa la acciones de un camión que transporta % paquetes…»)
 
 
Línea 1: Línea 1:
 
<source lang = "prolog">
 
<source lang = "prolog">
 +
 
% Ejercicio de planificación: los siguientes predicados describen un
 
% Ejercicio de planificación: los siguientes predicados describen un
 
% "mundo" que representa la acciones de un camión que transporta
 
% "mundo" que representa la acciones de un camión que transporta
Línea 38: Línea 39:
 
%% Signatura:
 
%% Signatura:
 
%% ----------
 
%% ----------
 +
 +
#const n = 8.
 +
paso(0..n).
 +
 +
paquete(p1;p2).
 +
elemento(camion).
 +
elemento(X) :- paquete(X).
 +
 +
ciudad(madrid;sevilla;barcelona).
  
 
%% ----------
 
%% ----------
Línea 43: Línea 53:
 
%% ----------
 
%% ----------
  
 +
autovia(madrid,sevilla).
 +
autovia(madrid,barcelona).
 +
 +
autovia(C1,C2) :- autovia(C2,C1).
  
 
%% ----------
 
%% ----------
Línea 48: Línea 62:
 
%% ----------
 
%% ----------
  
 +
fluyente(inercia,en(X,C)) :- ciudad(C),
 +
elemento(X).
 +
 +
fluyente(inercia,dentroCamion(X)) :- paquete(X).
 +
 +
fluyente(definido,descargado).
 +
 +
% Definición descargado.
 +
-cierto(descargado,I) :- cierto(dentroCamion(P),I),
 +
paquete(P),
 +
paso(I).
 +
 +
cierto(descargado,I) :- not -cierto(descargado,I),
 +
paso(I).
  
 
%% ---------
 
%% ---------
Línea 53: Línea 81:
 
%% ---------
 
%% ---------
  
 +
%% Acción cargar:
 +
 +
accion(cargar(P,C)) :- paquete(P),
 +
  ciudad(C).
 +
 +
% Efecto:
 +
 +
cierto(dentroCamion(P),I+1) :- ocurre(cargar(P,C),I),
 +
  I < n.
 +
 +
% Restricciones:
 +
% El paquete debe estar en la ciudad.
 +
-ocurre(cargar(P,C),I) :- not cierto(en(P,C),I),
 +
  paquete(P),
 +
  ciudad(C),
 +
  paso(I).
  
 +
% El camión debe estar en la ciudad.
 +
-ocurre(cargar(P,C),I) :- not cierto(en(camion,C),I),
 +
  paquete(P),
 +
  ciudad(C),
 +
  paso(I).
 +
 +
% El camión debe estar descargado.
 +
-ocurre(cargar(P,C),I) :- not cierto(descargado,I),
 +
  paquete(P),
 +
  ciudad(C),
 +
  paso(I).
 +
 
 +
%% Acción descargar:
 +
accion(descargar(P,C)) :- paquete(P),
 +
  ciudad(C).
 +
 +
% Efecto:
 +
cierto(en(P,C),I+1) :- ocurre(descargar(P,C),I),
 +
  I < n.
 +
 +
% Restricciones:
 +
% El paquete descargado debe estar en el camión.
 +
-ocurre(descargar(P,C),I) :- not cierto(dentroCamion(P),I),
 +
paquete(P),
 +
ciudad(C),
 +
paso(I).
 +
 +
% El camión debe estar en la ciudad de descarga.
 +
-ocurre(descargar(P,C),I) :- not cierto(en(camion,C),I),
 +
paquete(P),
 +
ciudad(C),
 +
paso(I).
 +
 
 +
%% Acción ir:  
 +
accion(ir(C1,C2)) :- ciudad(C1),
 +
ciudad(C2).
 +
 +
% Efecto:
 +
cierto(en(camion,C2),I+1) :- ocurre(ir(C1,C2),I),
 +
I < n.
 +
 +
% Restricciones:
 +
 +
% El camión debe estar en la ciudad de partida.
 +
-ocurre(ir(C1,C2),I) :- not cierto(en(camion,C1),I),
 +
ciudad(C1),
 +
ciudad(C2),
 +
paso(I).
 +
 +
% Debe existir una autovía entre las ciudades.
 +
-ocurre(ir(C1,C2),I) :- not autovia(C1,C2),
 +
ciudad(C1),
 +
ciudad(C2),
 +
paso(I).
  
 
%%----------------------------------------
 
%%----------------------------------------
Línea 59: Línea 157:
 
%%----------------------------------------
 
%%----------------------------------------
  
 +
% Si un objeto está en el camión, entonces no está en ninguna ciudad.
 +
 +
-cierto(en(P,C),I) :- cierto(dentroCamion(P),I),
 +
  ciudad(C),
 +
  paso(I).
 +
 +
% Si un objeto está en una ciudad no está en el camión.
 +
 +
-cierto(dentroCamion(P),I) :- cierto(en(P,C),I),
 +
  paso(I).
 +
 +
% Cada elemento solo puede estar en una ciudad.
 +
 +
-cierto(en(X,C1),I) :- cierto(en(X,C2),I),
 +
  ciudad(C1),
 +
  C1 != C2.
  
 +
% No puede haber dos paquetes diferentes dentro del camión al mismo tiempo.
  
 +
-cierto(dentroCamion(P1),I) :- cierto(dentroCamion(P2),I),
 +
  paquete(P1),
 +
  P1 != P2,
 +
  paso(I).
 +
 
 
%% Hipótesis del mundo cerrado para fluyentes definidos:
 
%% Hipótesis del mundo cerrado para fluyentes definidos:
  
-cierto(F,I) :- fluyente(definido,F), paso(I),
+
% -cierto(F,I) :- fluyente(definido,F), paso(I),
              not cierto(F,I).
+
%                not cierto(F,I).
  
 
%% Axioma de inercia para fluyentes inerciales:
 
%% Axioma de inercia para fluyentes inerciales:
Línea 87: Línea 207:
 
    
 
    
 
exito :- objetivo(I),
 
exito :- objetivo(I),
          I <= n.
+
        I <= n.
 
:- not exito.
 
:- not exito.
  
 
1{ocurre(A,I): accion(A)}1 :- paso(I),
 
1{ocurre(A,I): accion(A)}1 :- paso(I),
                              not objetivo(I),
+
                              not objetivo(I),
                              I < n.
+
                            I < n.          
                                       
+
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%% Estado inicial
 
%% Estado inicial
  
 +
cierto(en(p1,barcelona),0).
 +
cierto(en(camion,sevilla),0).
 +
cierto(en(p2,madrid),0).
  
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%% Objetivo:
 
%% Objetivo:
  
 
+
objetivo(I) :- cierto(descargado,I),
 
+
  cierto(en(p1,sevilla),I),
 +
  cierto(en(p2,barcelona),I).
 +
 
 
%% Presentación:
 
%% Presentación:
 
#show ocurre/2.
 
#show ocurre/2.
 
 
</source>
 
</source>

Revisión actual del 01:09 22 ene 2019

% Ejercicio de planificación: los siguientes predicados describen un
% "mundo" que representa la acciones de un camión que transporta
% paquetes entre ciudades:


% paquete(X): el objeto X es un paquete.

% ciudad(X): el objeto X es una ciudad.

% autovia(C1,C2): las ciudades C1 y C2 están conectadas por autovía.

% en(X,C): el elemento x (el camión o un paquete) está en la ciudad C.

% dentroCamion(X): el paquete X está cargado en el camión.

% descargado: el camión está descargado.

% Las acciones que se pueden realizar son las siguientes:

% cargar(P,C): el camión (que debe estar descargado) carga el paquete P
%              en la ciudad C.  Una vez cargado, el paquete ya no se
%              considera que esté en la ciudad C.

% descargar(P,C): el camión descarga el paquete P en la ciudad C.

% ir(C1,C2): el camión se desplaza por autovía desde la ciudad C1 a la
%            ciudad C2.

% Supongamos que deseamos encontrar la secuencia de acciones que a
% partir de un estado inicial en el que un paquete p1 está en Barcelona,
% un paquete p2 está en Madrid, y el camión está en Sevilla, deja
% finalmente el paquete p1 en Sevilla, el paquete p2 en Barcelona y el
% camión descargado. Supondremos que existe una autovía entre Barcelona
% y Madrid y otra entre Madrid y Sevilla.

%% ----------
%% Signatura:
%% ----------

#const n = 8.
paso(0..n).

paquete(p1;p2).
elemento(camion).
elemento(X) :- paquete(X).

ciudad(madrid;sevilla;barcelona).

%% ----------
%% Estáticos:
%% ----------

autovia(madrid,sevilla).
autovia(madrid,barcelona).

autovia(C1,C2) :- autovia(C2,C1).

%% ----------
%% Fluyentes:
%% ----------

fluyente(inercia,en(X,C)) :- ciudad(C),
							 elemento(X).
							 
fluyente(inercia,dentroCamion(X)) :- paquete(X).

fluyente(definido,descargado).

% Definición descargado.
-cierto(descargado,I) :- cierto(dentroCamion(P),I),
						 paquete(P),
						 paso(I).

cierto(descargado,I) :- not -cierto(descargado,I),
						paso(I).

%% ---------
%% Acciones:
%% ---------

%% Acción cargar:

accion(cargar(P,C)) :- paquete(P),
					   ciudad(C).
			
% Efecto:

cierto(dentroCamion(P),I+1) :- ocurre(cargar(P,C),I),
							   I < n.

% Restricciones:
% El paquete debe estar en la ciudad.
-ocurre(cargar(P,C),I) :- not cierto(en(P,C),I),
						  paquete(P),
						  ciudad(C),
						  paso(I).

% El camión debe estar en la ciudad.
-ocurre(cargar(P,C),I) :- not cierto(en(camion,C),I),
						  paquete(P),
						  ciudad(C),
						  paso(I).

% El camión debe estar descargado.
-ocurre(cargar(P,C),I) :- not cierto(descargado,I),
						  paquete(P),
						  ciudad(C),
						  paso(I).
						  
%% Acción descargar:			
accion(descargar(P,C)) :- paquete(P),
						  ciudad(C).

% Efecto:
cierto(en(P,C),I+1) :- ocurre(descargar(P,C),I),
					   I < n.

% Restricciones:
% El paquete descargado debe estar en el camión.
-ocurre(descargar(P,C),I) :- not cierto(dentroCamion(P),I),
							 paquete(P),
							 ciudad(C),
							 paso(I).

% El camión debe estar en la ciudad de descarga.							 
-ocurre(descargar(P,C),I) :- not cierto(en(camion,C),I),
							 paquete(P),
							 ciudad(C),
							 paso(I).
					   
%% Acción ir:					   
accion(ir(C1,C2)) :- ciudad(C1),
					 ciudad(C2).
					 
% Efecto:
cierto(en(camion,C2),I+1) :- ocurre(ir(C1,C2),I),
							 I < n.

% Restricciones:

% El camión debe estar en la ciudad de partida.
-ocurre(ir(C1,C2),I) :- not cierto(en(camion,C1),I),
						ciudad(C1),
						ciudad(C2),
						paso(I).
						
% Debe existir una autovía entre las ciudades.						
-ocurre(ir(C1,C2),I) :- not autovia(C1,C2),
						ciudad(C1),
						ciudad(C2),
						paso(I).

%%----------------------------------------
%% Codificación del sistema de descripción:
%%----------------------------------------

% Si un objeto está en el camión, entonces no está en ninguna ciudad.

-cierto(en(P,C),I) :- cierto(dentroCamion(P),I),
					  ciudad(C),
					  paso(I).

% Si un objeto está en una ciudad no está en el camión.

-cierto(dentroCamion(P),I) :- cierto(en(P,C),I),
							  paso(I).

% Cada elemento solo puede estar en una ciudad.

-cierto(en(X,C1),I) :- cierto(en(X,C2),I),
					   ciudad(C1),
					   C1 != C2.

% No puede haber dos paquetes diferentes dentro del camión al mismo tiempo.

-cierto(dentroCamion(P1),I) :- cierto(dentroCamion(P2),I),
							   paquete(P1),
							   P1 != P2,
							   paso(I).
							   
%% Hipótesis del mundo cerrado para fluyentes definidos:

% -cierto(F,I) :- fluyente(definido,F), paso(I),
%                 not cierto(F,I).

%% Axioma de inercia para fluyentes inerciales:

cierto(F,I+1) :- fluyente(inercia,F),
                cierto(F,I),
                not -cierto(F,I+1),
                I < n.

-cierto(F,I+1) :- fluyente(inercia,F),
                 -cierto(F,I),
                 not cierto(F,I+1),
                 I < n.
                 
%% Hipótesis del mundo cerrado para acciones:

-ocurre(A,I) :- accion(A), paso(I),
                not ocurre(A,I).
     
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%       
%% Módulo de planificación usando regla de elección:
  
exito :- objetivo(I),
         I <= n.
:- not exito.

1{ocurre(A,I): accion(A)}1 :- paso(I),
                              not objetivo(I),
                             I < n.           
		 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Estado inicial

cierto(en(p1,barcelona),0).
cierto(en(camion,sevilla),0).
cierto(en(p2,madrid),0).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Objetivo:

objetivo(I) :- cierto(descargado,I),
			   cierto(en(p1,sevilla),I),
			   cierto(en(p2,barcelona),I).
			   
%% Presentación:
#show ocurre/2.