martes, 20 de marzo de 2012

Video de la Historia de la IA

Datos de Integrantes

Universidad Técnica de Babahoyo
Facultad de Administración, Finanzas e Informática
Escuela de Sistemas

Integrantes
Quiñonez León Elsi Eloisa
Taris Mullo Rosa Marilin

Catedrático
Ing. Fernando Mejía

Cátedra
Inteligencia Artificial

Semestre
VII Ingeniería en Sistemas

Periodo Académico
Enero - Junio 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

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.