domingo, 23 de junio de 2013

capitulo 3


del capitulo 3
3. Listas, operadores y aritmética.



La "lista" es una estructura de datos ampliamente utilizada en la programación no numérica. Una lista es una secuencia de cualquier número de elementos, tales como los objetos ana, tenis, tomás, eskí. Esta lista se puede escribir en Prolog como:

[ ana, tenis, tomás, eskí ]

En Prolog todos los objetos estructurados son árboles y las listas no son una excepción.

¿Cómo puede una lista representarse como un objeto Prolog? Tenemos que considerar dos casos: si la lista está ó no vacía. En el primer caso la lista se escribe como un átomo Prolog : [].

En el segundo caso la lista puede verse como formada por dos cosas:

  1. (1). el primer elemento, llamado "cabeza" de la lista.
  2. (2). los elementos restantes, llamados en conjunto: "cola" de la lista.
Para el ejemplo anterior : [ ana, tenis, tomás, eskí ] la cabeza es : ana y la cola es : [ tenis, tomás, eskí ].

La cabeza y la cola se combinan en una estructura con un functor especial. El símbolo para este functor
depende de la implementación de Prolog. Asumiremos que se trata del punto [.] .

.( Cabeza, Cola)

Debido a que la cola es a su vez una lista, se tratará de una lista vacía ó una lista con cabeza y cola. Por lo tanto para representar listas de cualquier longitud no se necesita establecer ningún principio adicional. El ejemplo anterior se representa con el término:

.( ana, .( tenis, .( tomás, .( eskí, [] ))))

3.2. Operaciones sobre listas.

Las listas se pueden utilizar para representar conjuntos aunque se debe tomar en cuenta que existen diferencias: el orden de los elementos en un conjunto no interesa mientras que en una lista sí, además los objetos se pueden repetir en una lista y en un conjunto no. Aún con estas diferencias, las operaciones más frecuentes sobre listas son semejantes a las operaciones sobre conjuntos:

Pertenencia a una lista.

Implementaremos la relación miembro como:
miembro( X, L) donde X es un objeto y L es una lista. La meta miembro( X, L) es cierta si X es miembro de la lista L, por ejemplo :

miembro( b, [ a, b, c]) es cierta, y miembro( b, [ a, [ b, c] ]) no es cierta, pero miembro( [ b, c], [ a, [ b, c]])
es cierta. El programa para la relación de pertenencia se puede basar en la siguiente observación :

X es un miembro de L si,

  • (1) X es la cabeza de L, ó
  • (2) X es un miembro de la cola de L.
Esto puede representarse con dos cláusulas, la primera es un hecho simple y la segunda es una regla:

miembro( X, [ X | Cola]).
miembro( X, [ Cabeza | Cola] ) :- miembro( X, Cola).

Concatenación.

Para la operación de concatenación definiremos la relación:

concat( L1, L2, L3) donde L1 y L2 son dos listas y L3 es su concatenación. Por ejemplo:
concat( [a,b], [c,d], [a,b,c,d]) es cierta, pero concat( [a,b], [c,d], [a,b,a,c,d]) es falsa. En la definición de concat tendremos dos casos dependiendo del primer argumento L1:

  • (1) Si el primer argumento es la lista vacía entonces el segundo y el tercer argumento deben ser la misma lista:c oncat( [], L, L).
  • (2). Si el primer argumento de concat no es una lista vacía, entonces tiene cabeza y cola, es decir, se ve como : [ X | L1]
Ejercicios.

1. Escriba una meta, usando concat, para eliminar los tres últimos elementos de una lista L produciendo otra lista L1. Recomendación: L es la concatenación de L1 y una lista de tres elementos.

Solucion:
eliminar3(L, L1) :- concat([X,Y,Z], L1, L).
concat( [], L, L).
concat( [X|L1], L2, [X|L3]) :- concat( L1, L2, L3).
Ejecucion:
?- eliminar3([a,b,c,d,e], L).
L = [d, e] ;
No
2. Escriba una secuencia de metas para eliminar los tres primeros elementos y los tres
últimos elementos de una lista L produciendo la lista L2.

Solucion:
eliminar3(L, L1) :- concat([X,Y,Z], L1, L).
concat( [], L, L).
concat( [X|L1], L2, [X|L3]) :- concat( L1, L2, L3).
Ejecucion:
?- eliminar3([a,b,c,d,e], L).
L = [d, e] ;
No

3. Defina la relación: ultimo( Elemento, Lista) de tal modo que Elemento sea el último elemento de la lista Lista. Escriba dos versiones:

(a) usando la relación concat
(b) sin usarla.

4. Defina la relación max(X,Y,Max) de tal modo que Max sea el mayor valor de los
dos números X y Y.


5. Defina el predicado maxlist(List, Max) de tal manera que Max sea el mayor
número de la lista List de números.
6. Defina el predicado sumlist(List, Sum) donde Sum es la suma de una lista de
números dada en List.

7. Defina el predicado ordenada(List) el cual es cierto (devolverá yes) si List es una
lista ordenada de números en forma ascendente o descendente, por ejemplo,
?- ordenada(1,5,6,6,9,12).
Yes

8. Defina el predicado subsum(Set, Sum, Subset) donde Set es una lista de números,
Subset es un subconjunto de esta lista y Sum es la suma de los números en
Subset. Por ejemplo,
?- subsum([1,2,5,3,2], 5, Sub).
Sub = [1,2,2];
Sub = [2,3];
Sub = [5];

CAPITULO 5 prevención del retroceso.

1. la relación entre X  y Y pueden especificarse como las reglas siguientes y se representan de la siguiente manera en prolog.


f(X,0):-X<3.     %Regla 1
f(X,2):-3=<X,X<6.   %Regla 2
f(X,4):-6=<X.      %Regla 3



esto nos lleva a la formulación de las tres  reglas anteriores
ifX >3 then Y=0.
de-otro-modo ifX<6 then Y=2.
de-otro-modo Y=4.


en el primer recuadro lleva la tercera versión de prolog.
 f(X,0):- X<3,!.
f(X,2):-X<5,!.
f(X,4).
y el segundo recuadro nos muestra los símbolos de corte la cual nos muestra que Y da muchos valores por lo tanto son valores erróneos. 
f(X,0):-X<3.
f(X,2):-X<5.
f(X,4).

ahora utilizando el de corte  CALCULO DEL MAXIMO.
El procedimiento para  encontrar el valor máximo para una relación.
calculo  del maximo.
donde MAX es =X si x es mayor o igual a Y y MAX es Y si X es menor a Y.

max(X,Y,MAX).
max(X,Y,X):-X>=Y.
max(X,Y,Y):-X<Y.
max(X,Y,X):-X>=Y,!.
max(X,Y,Y).




Ejemplos:
Ejemplo 1:
Para decir en Prolog "Juan maneja todos los lenguajes excepto Prolog":
Si X es prolog entonces 'Juan maneja X' es falso
de otro modo, Si X es un lenguaje entonces 'Juan maneja X'.
en Prolog, para indicar que algo es 'falso' (no verdadero) se utiliza una meta especial 'fail',
la que siempre falla, provocando que la meta relacionada 'falle' :

Ejemplo 2:
Ahora definiremos la relación 'diferente(X,Y)' :
Si X y Y empatan (match) entonces 'diferente(X,Y)' falla;
de otro modo 'diferente(X,Y)' tiene éxito.
En prolog:

Ejemplo 3.
Definiremos ahora la relación 'not(Meta)' y la utilizaremos para realizar otra versión del
ejemplo 1 anterior :
'not(Meta)' se puede definir :
Si Meta tiene éxito, entonces not(Meta) falla;
de otro modo, not(Meta) tiene éxito.

en Prolog :


CAPITULO 4

Capitulo 4

                    
familia(persona(juan,perez,fecha(7,mayo,1950),trabaja(uag,2000)),
      persona(ana,flores,fecha(9,mayo,1951),no_trabaja),
[persona(jose,perez,fecha(5,mayo,1973),no_trabaja),
 persona(susana,perez,fecha(5,junio,1975),no_rabaja)]).

familia(
    persona(jorge,flores,fecha(21,abril,1953),trabajando(uag,2005)),
persona(edith,juarez,fecha(5,enero,1960),no_trabaja),
    [persona(pedro,flores,fecha(1,julio,1980),no_trabaja
    ]).


%X es esposo.
esposo(X):-familia(X,_,_).

%X es esposa.
esposa(X):-familia(_,X,_).

%X es hijo.
hijo(X):-familia(_,_,Hijos),miembro(X,Hijos).
miembro(X,[X|L]).
miembro(X,[Y|L]):- miembro(X,L).

%Existe persona.
existe(Persona):-esposo(Persona);esposa(Persona);hijo(Persona).


%Fecha de nacimiento.
fecha_de_nacimiento(persona(_,_,Fecha,_),Fecha).

%Salario de una persona.
salario(persona(_,_,_,trabaja(_,S)),S).
salario(persona(_,_,_,no_trabaja),0).

%Ingreso total de una familia.
total([],0).
total([Persona|Lista],Suma):- salario(Persona,S),total(Lista,Resto),Suma+Resto.

  Ejercicios.
Escribir preguntas para encontrar lo siguiente:
a). Nombres de las familias que no tienen hijos.
?- familia(persona(nombre,_,no tienen.hijos)).
b). Nombres de todos los hijos que no trabajan.
?-hijo(persona(nombre,_,no_trabaja)).
c). Nombres de las familias con esposas que trabajan y esposos que no trabajan.
?-familia(esposa(persona(nombre,trabaja)),esposo(persona(nombre,_,no_trabaja))).
d). Todos los hijos cuyos padres difieren en edad con al menos 10 años.
edad(padre,hijo),difieren(padre,hijo),edad >10anio.
e). Definir la relación: gemelos(Hijo1, Hijo2) que sirva para encontrar geme-los en la
base de datos.
?.-existe(gemelos(persona(nombre,apellido,fecha(_,_,_)))).



8). Todas las familias que tengan un ingreso por miembro de familia menor a 1000. 



(C). Resuelva usted solo los 5 ejercicios.

a). Nombres de las familias que no tienen hijos.

 familia(Esposo,Esposa,[]).
  
b). Nombres de todos los hijos que no trabajan.


hijo(X), salario(X,0). 



c). Nombres de las familias con esposas que trabajan y esposos que no trabajan.




familia(Y,Esposa,_), salario(Y,0). 




Ayuda Fuente: http://cocolibre.blogspot.mx/2013/04/ia-con-prolog-actividad-c41-usando.html  


d). Todos los hijos cuyos padres difieren en edad con al menos 10 años.

familia(Espo,Espa,Hijos), fecha_nacimiento(Espo,fecha(_,_,A1)), fecha_nacimiento(Espa,fecha(_,_,A2)), A2-A1 > 9, Hijos \= [].


e). Definir la relación: gemelos(Hijo1, Hijo2) que sirva para encontrar geme-los en la
base de datos. 

gemelos(H1,H2). 

sábado, 22 de junio de 2013

CAPITULO 2 geometría en prolog


1.-Sugiera una representación para rectángulos, cuadrados y círculos como
objetos Prolog estructurados. Escriba algunos ejemplos que representen objetos físicos
concretos utilizando la representación que sugirió.


1.-representando un circulo .

punto(X,Y).
circulo(punto(X1,Y1)).
radio(R).


punto(12,13).
punto(15,20).

linea(p


circle(X,Y,R).
circle(4,5,5).
circle(3,7,6).
centro(4,5).
radio(4).


iguales(R1,R2,R3,R4,Z):-
circle(R1,R2,Z), circle(R3,R4,Z).
12.
probando que efectivamente funciona.


para representar un triangulo en prolog.
trianguloequilatero(2,2,2).
 trianguloequilatero(3,3,3).
triangulo(2,2,5).
triangulo(3,4,6).


altura(R1).
altura(3).
altura(2).
altura(5).
lado(X1,X2).
lado(2,2).
lado(5,2).
lado(4,6).
base(R2).
base(2).
base(3).
base(4).


trianguloequilatero(R1,R2,R3).

iguales(B1,B2,B3):-
      trianguloequilatero(R1,R2,B3).

para hacer un cuadro en prolog mostrare el siguiente programa y tenemos la imagen
cuadro(4,4,4,4).
cuadro(1,1,1,1).
cuadro(R1,R2,R3,R4).
lado(4,4).
lado(1,1).
lado(R1,R2).
lado(R3,R4).
iguales(X1,Y1,X2,Y2):-
           cuadro(R1,R2,R3,R4).

martes, 18 de junio de 2013

capitulo 2

CAPITULO 2

EJERCICIOS:
2.1.1.Sugiera una representación para rectángulos,
 cuadrados y círculos como objetos Prolog estructurados. 
Escriba algunos ejemplos que representen objetos 
físicos concretos utilizando la representación que sugirió.

Circulo(punto(X,Y),radio(X,Y))        

Rectangulo(punto(X,Y),puntoc,punto(X,Y),punto(X,Y)).

Cuadrado(punto(X,Y),punto(X,Y),punto(X,Y),punto(X,Y)).

Ejemplos:

Triangulo(punto(X,Y),punto(X,Y),punto(X,Y)).
Línea(punto(X,Y),punto(X,Y)).

Rombo(punto(X,Y),punto(X,Y),punto(X,Y),punto(X,Y)).

2.2.1.¿Las siguientes operaciones de matching tienen 
éxito o fallan?,Si tienen éxito, ¿cuáles son las instanciaciones 
resultantes en las variables?
(a). punto( A, B) = punto( 1, 2).
            Tiene éxito
            Sus instanciaciones resultantes son:
A=1
            B=2
(b). punto( A, B) = punto( X, Y, Z).
            No tiene éxito
            false.
(c). +( 2, 2) = 4.
            No tiene éxito
             false.
(d). +( 2, D) = +( E, 2).
            Tiene éxito
            Sus instanciaciones resultantes son:
D=E
            E=2
(c). triangulo(punto(-1,0),P2,P3) = triangulo(P1,punto(1,0),punto(0,Y)).
            Tiene éxito
            Sus instanciaciones resultantes son:
P2 = punto(1, 0)
P3 = punto(0, Y)
P1 = punto(-1, 0)
2..2.2 Usando la representación que se definió anteriormente 
para segmentos de  línea, escriba un término que represente
 cualquier segmento de línea vertical en x = 5.
            linea(punto(5,Y1),punto(5,Y2)).
2.2.3. Asuma que un rectángulo se representa con el término
 rectángulo( P1, P2, P3, P4) donde P1,P2,P3,P4 son los vértices 
del rectángulo ordenado positivamente. Defina la relación 
regular( R) que es verdad (true) si R es un rectángulo cuyos
 lados son vertical y horizontal.
rectangulo(punto(X,Y),punto(X,Y),punto(X,Y),punto(X,Y)).
regular(R).
rectangulo(lado1(horizontal),lado2(vertical),lado3(horizontal),lado4(vertical)).
(R)=true.

2.3.1 Considere el siguiente programa:
f( 1, uno).
f( s(1), dos).
f( s(s(1)), tres).
f( s(s(s(X))), N) :- f( X, N).
¿Cómo contestará Prolog las siguientes preguntas? 
Cuando sean posibles varias respuestas, dé al menos dos de ellas.
(a). ?- f( s(1), A).
            Respuesta de Prolog:
            A=dos
(b). ?- f( s(s(1)), dos).
            Respuesta de Prolog :
           false.
(c). ?- f( s(s(s(s(s(s(1)))))), C).
            Respuesta de Prolog:
            C = uno.
(d). ?- f( D, tres).
          Respuesta de Prolog:
            D = s(s(1)).
2.3.2El siguiente programa dice que dos personas son 
parientes si,
(a). uno es predecesor del otro, ó
(b). ambos tienen un predecesor común, ó
(c). ambos tienen un sucesor común :
parientes( X, Y) :- predecesor( X, Y).
parientes( X, Y) :- predecesor( Y, X).
parientes( X, Y) :- predecesor( Z, X), predecesor( Z, Y).
parientes( X, Y) :- predecesor( X, Z), predecesor( Y, Z).
¿ puede usted acortar el programa usando la notación de ';' ?
parientes(X,Y) :- predecesor(X,Y) ; predecesor(Y,X) ;predecesor(Z,X),
 predecesor(Z,Y) ; predecesor(X,Z) , predecesor(Y,Z).
2.3.3.Reescriba el siguiente programa sin utilizar la notación de ';' :
traducir( Numero, Palabra) :-
Numero = 1, Palabra = uno;
Numero = 2, Palabra = dos;
Numero = 3, Palabra = tres.
traducir(Numero,Palabra) :- Numero=1,Palabra=uno.
traducir(Numero,Palabra) :- Numero=2,Palabra=dos.
traducir(Numero,Palabra) :- Numero=3,Palabra =tres.

2.3.4 Considere el programa anterior y realize la traza de ejecución 
a la pregunta :
?- enorme(X), oscuro(X).
Compare su traza de ejecución con la anterior, ya que 
esencialmente es la misma pregunta pero con otro orden. 
¿En cuál de ambos casos Prolog realiza más trabajo
 antes de encontrar la respuesta final?
                   Traza de la Ejecució
 1)    Lista inicial de metas: enorme(X), oscuro(X).
 2)    Examina el programa de arriba hacia abajo buscando una cláusula
cuya cabeza empate con la primera meta:
enorme (X)
Se encuentra la cláusula 1: enorme (oso).
Esta cláusula no tiene cuerpo, así que la lista de metas, luego de
instanciarse se convierte en:            
 oscuro(oso)
 3)    Examina el programa para buscar la meta oscuro(oso), encuentra la 
cláusula 7 que luego de instanciarse se convierte 
 enorme(oso),negro(oso)
4)    Examina el programa para buscar la meta negro(oso), no se
encuentra ninguna cláusula. 
Por lo tanto se realiza un proceso de backtracking al paso 3) y 
se elimina la instanciación 
negro(oso)
 Se continúa examinando el programa a partir de la cláusula 7.
5)Examina el programa para buscar la meta oscuro(oso), encuentra la cláusula 8 que
luego de instanciarse se convierte en:
enorme(oso),cafe(oso)
Esta cláusula no tiene cuerpo, así que la lista de metas se queda vacía. 
Esto indica una terminación exitosa y la instanciación correspondiente 
a la variable queda como:
                  X = oso.

En la  traza de ejecución: oscuro(X),enorme(X)  Prolog realiza más trabajo 
antes de encontrar la respuesta final.