Práctica de Prolog: Introductorios (Paradigmas)

De Cuba-Wiki
Saltar a: navegación, buscar
Back.png Volver a la página de la materia

% Ejercicio 1
% A partir de los predicados binarios padre y esposo y de los predicados unarios hombre y mujer, definir
% en Prolog los predicados binarios: hijo, abuelo, progenitor, hermano, descendiente, tio.

% i. Considerar el ´arbol geneal´ogico de la siguiente figura. Dibuje el ´arbol de b´usqueda de Prolog
% para la consulta abuelo(Who, ron).

%padre(-Padre, -Hijo)
%esposo(-Hombre, -Mujer)
padre(john, sue).
padre(john, bill).
padre(bob, nancy).
padre(bob, jeff).
padre(bill, ron).
esposo(john, mary).
esposo(bob, sue).
esposo(bill, jane).
hombre(john).
hombre(bob).
hombre(jeff).
hombre(bill).
hombre(ron).
mujer(mary).
mujer(sue).
mujer(nancy).
mujer(jane).

%hijo( -Hijo, -Persona)
hijo(Hijo, Persona) :- hombre(Persona), padre(Persona, Hijo).
hijo(Hijo, Persona) :- mujer(Persona), esposo(Esposo, Persona), hijo(Hijo, Esposo).

%abuelo(-Abuelo, -Nieto)
abuelo(Abuelo, Nieto) :- hijo(Nieto, Progenitor), hijo(Progenitor, Abuelo).

%progenitor(-Progenitor, -Hijo)
progenitor(Progenitor, Hijo) :- hijo(Hijo, Progenitor).

%hermano(-Hermano, -Persona)
hermano(Hermano, Persona) :- progenitor(Progenitor, Hermano), progenitor(Progenitor, Persona), Hermano \= Persona.

%descendiente(-Descendiente, -Ascendiente)
descendiente(Descendiente, Ascendiente) :- hijo(Descendiente, Ascendiente).
descendiente(Descendiente, Ascendiente) :- hijo(Descendiente, Padre), descendiente(Padre, Ascendiente).

%tio(-Tio, -Sobrino)
tio(Tio, Sobrino) :- hijo(Sobrino, Padre), hermano(Tio, Padre).

% ii. Defina una nueva relaci´on primo. ¿C´omo se puede definir una consulta para conocer todos los
% primos de ron?

%primo(-Primo, -OtroPrimo)
primo(Primo, OtroPrimo) :- abuelo(Abuelo, Primo), abuelo(Abuelo, OtroPrimo), Primo \= OtroPrimo.

%ii. Respuesta: primo(ron, Primo).

% iii. Considerar el agregado del siguiente hecho y regla:
% ancestro(X, X).
% ancestro(X, Y) :- ancestro(Z, Y), progenitor(X, Z).
% y el ´arbol geneal´ogico del item anterior.
% a) Explicar la respuesta a la consulta ancestro(bill, X).

% iii. a. ancestro(bill, X).
% iii. a. salida: X = bill; X = ron; Loop Infinito...

% b) Describir las circunstancias en las que puede ocurrir un loop infinito en Prolog.

% c) Sugerir un soluci´on al problema hallado en los puntos anteriores reescribiendo el programa
% de ancestro.


% iii. c. ancestro:
ancestro(X, X).
ancestro(X, Y) :- ancestro(Z, Y), progenitor(X, Z).


% Ejercicio 2
% Usando la definici´on de n´umero natural a partir de cero y sucesor, definir un predicado unario nn,
% tal que nn(-X) sii X es un n´umero natural. Definir las siguientes relaciones entre n´umeros naturales:

%data Nat = cero | sucesor Nat

%nn(-X).
nn(cero).
nn(sucesor(X)) :- nn(X).

tonn(0, cero).
tonn(X, sucesor(Y)) :- X > 0, PrevX is X - 1, tonn(PrevX, Y).

% i. moi(-X, +Y) sii X es menor o igual que Y.
moi(cero, Y) :- nn(Y).
moi(sucesor(X), sucesor(Y)) :- moi(X, Y).

% menor(-X, +Y) sii X es menor que Y.
menor(cero, sucesor(Y)) :- nn(Y).
menor(sucesor(X), sucesor(Y)) :- menor(X, Y).

% ii. producto(+X, +Y, -Z) sii Z es el producto de X con Y.
%suma(-X, -Y, -Z) sii Z es la suma de X con Y.
suma(X, cero, X) :- nn(X).
suma(X, sucesor(Y), sucesor(Z)) :- suma(X, Y, Z).

%producto(+X, +Y, -Z)
producto(X, cero, cero) :- nn(X).
producto(X, sucesor(Y), Z) :- producto(X, Y, XPorY), suma(X, XPorY, Z).

% iii. fact(+X, -F) sii F es el factorial de X.
%iii. fact(+X, -F) sii F es el factorial de X.
fact(cero, sucesor(cero)).
fact(sucesor(X), F) :- fact(X, PrevF), producto(sucesor(X), PrevF, F).

%iv. mod(+X, +Y, -Z) sii Z es el resto de la divisi´on entrera entre X e Y. Definicion recursiva.
mod(X, X, cero) :- X \= cero, nn(X).
mod(X, Y, X) :- Y \= cero, X \= Y, moi(X, Y).
mod(X, Y, Z) :- Y \= cero, suma(XMenosY, Y, X), mod(XMenosY, Y, Z).

%iv. modNR(+X, +Y, -Z) sii Z es el resto de la divisi´on entrera entre X e Y. Definicion no recursiva.
%Propiedad: Z + K * Y = X
modNR(X, X, cero) :- X \= cero, nn(X).
modNR(X, Y, X) :- Y \= cero, X \= Y, moi(X, Y).
modNR(X, Y, Z) :- Y \= cero, moi(K, X), menor(Z, Y), producto(K, Y, CasiX), suma(CasiX, Z, X).

%v. Definir un predicado unario que determine si un n´umero entero dado es primo. Tener en cuenta que el argumento siempre est´a instanciado.
no_es_primo(cero).
no_es_primo(sucesor(cero)).
no_es_primo(X) :- nn(X), menor(Menor, X), menor(sucesor(cero), Menor), mod(X, Menor, cero).
primo(X) :- not(no_es_primo(X)).


sumaPrimo(float(Entera1, Dec1), float(Entera2, Dec2)) :-
sumaPrimo(float(Entera1, Dec1), float(Entera2, Dec2)) :- noventaYNueve(N99), moi(Dec1, N99), moi(Dec2, N99),
producto(Entera1, suc(N99), Ent1), producto(Entera2, suc(N99), Ent2),
suma(Ent1, Dec1, Num1), suma(Ent2, Dec2, Num2), moi(Num1, Num2),
suma(Entera2, Dec2, Primo), primo(Primo).