% PD 2007-08: Examen 2 (Grupos 1C y 1D) (21 de enero de 2008)
% ====================================================================== 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% La conjetura de Golbach indica que todo número par positivo mayor que
% 2 es equivalente a la suma de dos números primos. Por ejemplo,
% 20 = 3 + 17.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 1: Definir en Prolog la relación golbach(+N,-I1,-I2) que se
% verifique si I1 e I2 son dos números primos cuya suma es N. Por
% ejemplo,
%    ?- golbach(20,I1,I2).
%    I1 = 3
%    I2 = 17 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

golbach(N,I1,I2) :-
   natural(I1),
   primo(I1),
   I2 is N-I1,
   primo(I2).

% primo(+N) se verifica si N es primo. Por ejemplo,
%    ?- primo(7).
%    Yes
%    ?- primo(9).
%    No
primo(N) :-
   findall(X,(between(1,N,X), N mod X =:= 0),[1,N]).

% natural(?N) se verifica si N es un número natural. Por ejemplo,
%    ?- natural(N).
%    N = 1 ;
%    N = 2 ;
%    N = 3 
%    Yes
natural(1).
natural(N1) :-
   natural(N),
   N1 is N+1.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Se dice que la palabra P1 es semejante por eliminación a la palabra P2
% si P2 se obtiene eliminando una letra de P1. Por ejemplo, "hosla" es
% semejante por eliminación a "hola".
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ejercicio 3: Definir en Prolog la relación semejantePorEliminación(A1,A2)
% que se verifique si el átomo A1 es semejante por eliminación al átomo
% A2. Por ejemplo,
%    ?- semejantePorEliminación(hosla,hola).
%    Yes
%    ?- semejantePorEliminación(hoslas,hola).
%    No
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

semejantePorEliminación(A1,A2) :-
   name(A1,L1),
   name(A2,L2),
   select(_,L1,L2).
