martes, 20 de marzo de 2012

Ejercicios de Prolog

%%

%% declaraciones

%%

padrede('juan', 'maria'). % juan es padre de maria

padrede('pablo', 'juan'). % pablo es padre de juan

padrede('pablo', 'marcela').

padrede('carlos', 'debora').

% A es hijo de B si B es padre de A

hijode(A,B) :- padrede(B,A).

% A es abuelo de B si A es padre de C y C es padre B

abuelode(A,B) :-

padrede(A,C),

padrede(C,B).

% A y B son hermanos si el padre de A es también el padre de B y si A y B no son lo mismo

hermanode(A,B) :-

padrede(C,A) ,

padrede(C,B),

A \== B.

% A y B son familiares si A es padre de B o A es hijo de B o A es hermano de B

familiarde(A,B) :-

padrede(A,B).

familiarde(A,B) :-

hijode(A,B).

familiarde(A,B) :-

hermanode(A,B).

%%

%% consultas

%%

% juan es hermano de marcela?

?- hermanode('juan', 'marcela').

yes

% carlos es hermano de juan?

?- hermanode('carlos', 'juan').

no

% pablo es abuelo de maria?

?- abuelode('pablo', 'maria').

yes

% maria es abuela de pablo?

?- abuelode('maria', 'pablo').

no

Factorial de un número

% La sintaxis es factorial(N, F) -> Factorial de N es F (el resultado se guarda en F)

factorial(0, 1).

factorial(N, F) :- N>0, N1 is N - 1, factorial(N1, F1), F is N * F1.

%el factorial se llama recursivamente dejando el resultado en F

Usos de Listas en Prolog

Creación y consulta de listas

plantas([manzana, naranja, limon, espinaca, gardenia, alfalfa,pino]).

lista([H|T]).

H=1

T=[2,3]

?-lista([H,J|T]).

H=1

J=2

T=[3]

Longitud de una lista

% Si queremos hallar la longitud de una lista.

% La longitud de una lista vacia es 0.

% La longitud de cualquier lista es la longitud de la cola + 1.

longitud([],0).

longitud([_|T],N):-longitud(T,N0), N is N0 + 1.

?- longitud([a,b,c],L).

L = 3

?- longitud([a,b,c],4).

No

Búsqueda de un elemento

% Si queremos determinar si un elemento pertenece a una lista.

% El elemento pertenece a la lista si coincide con la cabeza de la lista.

% El elemento pertenece a la lista si se encuentra en la cola de la lista.

pertenece(X,[X|_]) :- !.

pertenece(X,[_|R]):- pertenece(X,R).

?- pertenece(b,[a,b,c]).

Yes

?- pertenece(b,[a,[b,c]]).

No

?- pertenece([b,c],[a,[b,c]]).

Yes

Eliminar elemento de una lista

% Si queremos eliminar un elemento de la lista.

% Si X es la cabeza de la lista, la cola T es la lista sin X

% Si X no es la cabeza de la lista, conservamos la cabeza de la lista

% como parte de la respuesta y continuamos eliminando X de la cola T.

elimina(X,[X|T],T).

elimina(X,[H|T],[H|T1]):- elimina(X,T,T1).

?- elimina(1,[1,2,3,4],R).

R = [2,3,4]

?- elimina(1,R,[2,3]).

R = [1, 2, 3]

R = [2, 1, 3]

R = [2, 3, 1]

Concatenar listas

% Si queremos concatenar dos listas lista.

% Concatenar una lista vacia con L es L.

% Concatenar X|L1 con L2 es poner el primer

% elemento de la primera lista (X) más la

% concatenación del resto de la lista (L1) con L2

concatenar([],L,L).

concatenar([X|L1],L2,[X|L3]):-concatenar(L1,L2,L3).

?- concatenar([1,2],[3,4],R).

R = [1, 2, 3, 4].

Comprobar si una lista es la inversa de otra

% Si queremos calcular la inversa de una lista.

% La inversa de una lista vacia es una lista vacia.

% La inversa de H|T es la inversa de T concatenada con H.

inversa([],[]).

inversa([H|T],L):- inversa(T,R), concatenar(R,[H],L).

?- inversa([a,b,c,d],[d,c,b,a]).

Yes/Si

% Utilizando un parametro acumulador.

inver([H|T],L,S):-inver(T,L,[H|S]).

?- inver([a,b,c,d],[d,c,b,a]).

Yes

No hay comentarios: