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