%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Problema 3: Estructura secundaria del ARN.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ulises Pastor Díaz.
% Lógica computacional.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Descripción del problema: Dada una secuencia de ARN S= s_1...s_n
% determinar la estructura secundaria que minimiza una cierta energía.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 1: Determinar los dominios de la secuencia.
%
% Bases.
base(a). base(u). base(g). base(c).
% Determinar los índices.
ind(I) :- seq(I,B).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 2: Construcción del emparejamiento.
%
% Generación del emparejamiento.
{pair(J,I) : ind(I)} 1 :- ind(J).
% El emparejamiento es simétrico e inyectivo.
:- ind(I), ind(J), ind(K), I < J, pair(I,K), pair(J,K).
pair(I,J) :- ind(I), ind(J), pair(J,I).
% Cada posición no se empareja con si misma ni con la siguiente.
:- ind(I), pair(I,I).
:- ind(I), ind(J), I = J+1, pair(I,J).
% OPCIONAL: No se pueden pseudonudos.
:- ind(I1;I2;I3;I4), I1 < I2, I2 < I3, I3 < I4, pair(I1,I3), pair(I2,I4).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 3: Buenos emparejamientos entre bases.
% Emparejamientos erróneos.
wrong(X,X) :- base(X).
wrong(a,c). wrong(a,g). wrong(c,u).
% No podemos tener emparejamientos erróneos.
:- wrong(B1,B2), seq(I,B1), seq(J,B2), pair(I,J).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 5: Presentación:
#show pair/2.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 6: Optimización. --opt-mode=optN
%% Energía: E = -|P|
% #minimize{-1@1,I,J : pair(I,J)}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Parte 7: Problema de decisión.
#const k=9.
2*k {pair(I,J) : ind(I), ind(J)} 2*k.