Acciones

Estructura secundaria del ARN

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

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