%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Problema 5: Reparación de redes metabólicas
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ulises Pastor Díaz.
% Lógica computacional.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Descripción del problema: Dado un grafo de influencia G = (V,E,c) con
% c: E -> {+,-} y un etiquetado m:V -> {+,-} (parcial) de los vértices,
% corregir G para que sea consistente con m con el mínimo número de
% operaciones.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 1: Definición de los signos.
%
% Signos.
signo(menos). signo(mas).
% Predicado opuesto.
opuesto(mas,menos). opuesto(menos,mas).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 2: Construcción del etiquetado.
%
%% Etiquetado para vértices.
1 {m(V,S) : signo(S)} 1 :- vertice(V).
% Consistecia con la observación.
m(V,S) :- obs(V,S).
%% Etiquetado de arcos.
1 {c(U,V,S) : signo(S)} 1 :- arco(U,V).
% Consistecia con la observación.
c(U,V,S) :- not error(U,V), obs(U,V,S).
c(U,V,T) :- error(U,V), obs(U,V,S), opuesto(T,S).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 3: Detección de errores, competibilidad.
% Generación de errores.
{error(U,V)} :- arco(U,V).
% Reglas de signos. (Predicado signo no necesario).
resultado(V,mas) :- arco(U,V), c(U,V,S), m(U,S).
resultado(V,menos) :- arco(U,V), opuesto(S,T), c(U,V,S), m(U,T).
%% El etiquetado debe ser consistente.
:- m(U,S), not resultado(U,S), not entrada(U).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 5: Presentación:
#show error/2.
#show m/2.
#show c/3.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 6: Optimización. --opt-mode=optN
errores(N) :- N = #count{1 : error(U,V)}.
#minimize{1,U,V : error(U,V)}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Parte 7: Problema de decisión.
#const k = 2.
% :- k+1 {error(U,V) : arco(U,V)}.