![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD_AEKzfMuQzeMWPDjIv7nh-65bCEC_5tZSJsdTmQVSRTptpMTAA05Wuv6mFxpRBfr5ADbhlnENolWOhyphenhyphen5h5FVBee67Zo7Jo-SJyXcfP63ypBfKoLOtwlT_ahL36rE_g4rnucYFt2wixpe/s200/droidwithbrokenarmhgclrnx0.gif)
miércoles, 21 de marzo de 2012
Bibliografía
http://es.wikipedia.org/wiki/Inteligencia_artificial
http://es.wikipedia.org/wiki/Conferencia_de_Dartmouth
http://arkanet.galeon.com/prolog.htm
http://es.wikipedia.org/wiki/Prolog#Historia
http://www.dcc.uchile.cl/~abassi/IA/Prolog.html
http://www.monografias.com/trabajos5/prolog/prolog.shtml
martes, 20 de marzo de 2012
Datos de Integrantes
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
Estructura de un programa PROLOG
Un programa Prolog está formado por una secuencia de enunciados: hechos, reglas y comentarios.
Una relación puede estar especificada por hechos, simplemente estableciendo objetos que satisfacen la relación o por reglas establecidas acerca de la relación.
Cada regla está formada por un primer miembro (o la cabeza de la regla), un segundo miembro (o cola de la regla) ligados por " :- " y termina con el carácter " . ".
Código del programa
** Hechos **
mujer(maria).
hombre(pedro).
hombre(manuel).
hombre(arturo).
** Relaciones **
padre(pedro,manuel).
padre(pedro,arturo).
padre(pedro,maria).
Hechos
Un hecho, en PROLOG, es una relación entre objetos.
Ejemplo: La capital de Francia es París.
En Prolog se escribe capital (francia,parís).
En general, la sintaxis es relación(objeto, objeto, ...).
La relación se conoce como el predicado y los objetos como los argumentos. Los nombres de todos los predicados y argumentos deben de comenzar con una letra minúscula.
Primero, se escribe el predicado. Los argumentos se escriben separándolos mediante comas y encerrados entre paréntesis.
Al final del hecho debe ir un punto.
Reglas
Una regla consta de dos partes, una cabeza y un cuerpo. La cabeza y el cuerpo están unidos mediante el símbolo:
cabeza:-cuerpo.
El cuerpo puede estar formado por varios hechos.
cabeza :- hecho1, hecho2, ..., hechon.
La separación: Se lee "si"(la cabeza es verdad si el cuerpo es verdad.)
Ejemplo: Es divisible por dos(X):-par(X). (Se lee X es divisible por dos si X es par.).
Esta cláusula en Prolog es equivalente a la fórmula de primer orden (8 X) par(X) ) Es divisible por dos(X).
Por tanto, si podemos probar que X es par entonces hemos probado que X es divisible por dos. En la cabeza de una regla no puede haber más de un hecho.
Ejemplo: rico(juan)feliz(juan)^poderoso(juan)
No se puede expresar directamente en Prolog como feliz(juan),poderoso(juan):-rico(juan).
Variables
Las variables se utilizan para escribir hechos y reglas generales.
Los nombres de las variables deben comenzar con letra mayuscula o con el carácter ( ).
Ejemplos:
Mi primer nombre de variable Persona a123
Para Prolog, dos nombres idénticos para una variable sólo se refieren al mismo objeto si están en la misma cláusula.
Por tanto, en el siguiente ejemplo,
feliz(X):-tiene salud(X).
legusta(juan,X):-le gusta(juan,X).
La variable X de la primera cláusula no se refiere al mismo objeto que en la segunda.