Acciones

Predicción de la estructura de proteínas

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

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Problema: Predicción de estructura de proteinas.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ulises Pastor Díaz.
% Lógica computacional.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Descripción del problema: Dada una secuencia de aminoácidos
% hidrofóbicos o polares, determinar la estructura espacial (en 2D) que
% maximiza los enlaces hidrofóbicos.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 1: Determinar los dominios de la secuencia y del tablero.
%
% Tamaño.

size(N) :- N = #count{I : prot(I,J)}.

% Tablero.

board(1..2*N) :- size(N).

% Casillas.

range(X,Y) :- size(N), board(X), board(Y), |X-N| + |Y-N| <= N.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 2: Generación de las posiciones.
%
% Primera y segunda posición.

sol(1,N,N) :- size(N).
sol(2,N,N+1) :- size(N).

% Generación del resto de posiciones.

1 {sol(I,X,Y) : range(X,Y)} 1 :- prot(I,Amino).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 3: Restricciones geométricas.

% No podemos tener dos aminoácidos en la misma casilla.

:- prot(I,A), prot(J,B), I < J, sol(I,X,Y), sol(J,X,Y), range(X,Y).

% Adyacencia en el tablero.

next(I,J) :- prot(I,A), prot(J,B), I < J, 
			 sol(I,X1,Y1), sol(J,X2,Y2), 
			 range(X1,Y1), range(X2,Y2), 
			 1 == |Y1-Y2|+|X1-X2|.

% Dos aminoácidos consecutivos son adyacentes.

:- prot(I,A), prot(J,B), I == J-1, not next(I,J).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 5: Presentación:

#show sol/3.
#show epair/2.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%% Parte 6: Optimización. --opt-mode=optN 

% Diremos que una pareja es energética si sus aminoácidos son h y son
% adyacentes sin ser consecutivos.

epair(I,J) :- prot(I,h), prot(J,h), next(I,J), I+2 < J. % 1 == (I-J) #mod 2

#maximize{1,I,J : epair(I,J)}.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Parte 7: Problema de decisión.

% #const k=2.

% :- {epair(I,J) : prot(I,A),prot(J,B)} k-1.