%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Problema 6: Completación de redes metabólicas.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ulises Pastor Díaz.
% Lógica computacional.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Dado un grafo bipartito dirigido G = (R u M, E) dónde R son
% reacciones, M son metabolitos y E representa que metabolitos son
% reactantes y productos de cada reacción R, el problema es dado un
% conjunto de semillas S y otra de resultantes T, determinar qué
% reacciones debemos obtener a un subgrafo dado para poder producir los
% los resultantes a partir de las semillas.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 1: Tipos de reacción.
%
% Predicado tipo.
tipo(R) :- red(R).
tipo(a). tipo(x).
% Tipo a: del grafo completo. Tipo x: Añadidas a la red.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 2: Extensión del grafo.
%
% Las reacciones preexistentes son de tipo x.
reaccion(R,x) :- reaccion(R,N), red(N).
% Podemos añadir las reacciones de tipo a.
{reaccion(R,x)} :- reaccion(R,a).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 3: Condición de alcanzable.
%
% Definición del predicado alcanzable.
alcanzable(M,T) :- semilla(M), tipo(T).
alcanzable(M,T) :- tipo(T), alcanzable(N,T), producto(M,R), reaccion(R,T), not irrealizable(R,T).
% Predicado auxiliar irrealizable.
irrealizable(R,T) :- not reaccion(R,T), reaccion(R,a), tipo(T).
irrealizable(R,T) :- tipo(T), reactante(N,R), not alcanzable(N,T).
% Todo objetivo es alcanzable.
:- objetivo(M), not alcanzable(M,x).
% Predicado nuevo.
nuevo(R) :- reaccion(R,x), red(N), not reaccion(R,N).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 5: Presentación:
% #show nuevo/1.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 6: Optimización. --opt-mode=optN
nuevos(N) :- N = #count{R : nuevo(R)}.
% #minimize{1,R : nuevo(R)}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Parte 7: Problema de decisión.
#const k = 1.
:- k+1 {nuevo(R) : reaccion(R,a)}.