miércoles, 14 de enero de 2015

Ejercicios Capitulo 3

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.

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, y (b) sin usarla.


PREGUNTEMOS:

1 ?- ultimo(d,[a,c,e,f,d,f]).
false.

2 ?- ultimo(a,[d,e,g,h,f,a]).
true .

3 ?- ultimo(a,[a,a,a,a,a,a,a,a]).
true .

4 ?- ultimo(6,[2,3,4,5,1,7,6,2]).
false.

5 ?- ultimo(darwin,[marco,luis,lorenzo,antonio,daniel]).   //son mis amigos xD
true .


3.4. Aritmética.


1. 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.
max(X,Y,Max).
max(X,Y,Max):-X<Max,Y<Max.


2. Defina el predicado maxlist(List, Max) de tal manera que Max sea el mayor
número de la lista List de números.
maxlist(List,Max).
maxlist(List,Max):-Max>List.


3. Defina el predicado sumlist(List, Sum) donde Sum es la suma de una lista de
números dada en List.
sumlist(List,Sum).
List([X,Y,Z]).
sumlist(List,Sum):-X is Y is Z=:=Sum.


4. 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
ordenada(List).
List(X,Y,Z).
ordenada(List):-X<Y<Z=:=ascendente.
ordenada(List):-X>Y>Z=:=descendente.

5. 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];
subsum(set,Sum,Subset).
subsum(Set,Sum,Subset):-Set=:=[X,Y,Z],Sum=:= Y,Subset=:=Sub.















Ejercicios - Procedural

1. 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?

a). Programa.
enorme( oso). % cláusula 1
enorme( elefante). % cláusula 2
chico( gato). % cláusula 3
cafe( oso). % cláusula 4
negro( gato). % cláusula 5
gris( elefante). % cláusula 6
oscuro( Z) :- % cláusula 7 : cualquier negro es oscuro.
negro( Z).
oscuro( Z) :- % cláusula 8 : cualquier café es oscuro.
cafe( Z).

(b). Pregunta.

?- enorme( X), oscuro( X). % Quién es oscuro y enorme ?

(c).Traza de la Ejecución
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.



Ejercicios - operaciones matching



Ejercicio. 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)).

1. ¿ Las siguiente operaciones de matching tienen éxito ó 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 resultantes son:
D=E
E=2
(e). triangulo(punto(-1,0),P2,P3) = triangulo(P1,punto(1,0),punto(0,Y)).
Tiene éxito
Sus resultantes son:
P2 = punto(1, 0)
P3 = punto(0, Y)
P1 = punto(-1, 0)



2.3. Significado declarativo.

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. El 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
).

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.














Ejercicio 1.6 - Reglas recursivas

1.6.Considere las siguiente definicion alternativa de predecesor:

1).predecesor(X,Z):-progenitor(X,Z).
2).predecesor(X,Z):-progenitor(Y,Z),predecesor(X,Y).
¿Es apropiada esta definicion?
Si
¿Puede usted dibujar una diagrama que corresponda con estas definiciones?
si

diagrama 1


diagrama 2

Ejercicio 1.3 Reglas

1.3. Traduzca las siguientes sentencias a reglas Prolog.
a). Cualquiera que tiene un hijo es feliz (introduzca la relación unaria llamada 'feliz').
X es feliz, si X es progenitor
feliz (X) :- progenitor (X,Y)
Esta pregunta de dos pasos se puede escribir en Prolog:
?- feliz(X).



b). Para todo X, si X tiene un hijo que tiene una hermana, entonces X tiene dos hijos
(introduzca la relación tiene-dos-hijos).


tiene_dos_hijos(X,Y):-hermana(Y,Z),progenitor(X,Y),progenitor(X,Z),mujer(Z).


1.4. Defina la relación 'nieto' usando la relación 'progenitor'.
Recomendación: Será similar a la relación abuelo.


Ahora queremos preguntar ¿quién es el nieto de roberto?


El programa no incluye la relación 'nieto', sin embargo podemos hacer la pregunta en dos pasos:
1). De Quién es progenitor roberto, asumimos que de algún Y.
2). De Quién es progenitor este Y, asumimos que de algún X.
Esta pregunta de dos pasos se puede escribir en Prolog:
?- progenitor( roberto, Y) , progenitor( Y, X ).
X = jaime
Y = patricia
En general, ¿quién es el nieto de Z?


El programa no incluye la relación 'nieto', sin embargo podemos hacer la pregunta en dos pasos:
1). De Quién es progenitor Z, asumimos que de algún Y.
2). De Quién es progenitor este Y, asumimos que de algún X.
Esta pregunta de dos pasos se puede escribir en Prolog:
?- progenitor( Z, Y) , progenitor( Y, X ).

Mi árbol Familiar

Mi árbol Genealógico
Utilizando el programa prolog voy a hacer un ejercicio del primer capitulo que se trata de los progenitores.

progenitor(leonor, miguel).
progenitor(bartolo, miguel).
progenitor( camilo, misael).
progenitor(josefina, misael).
progenitor( miguel, marco).
progenitor( miguel, yesenia).
progenitor(misael, marco).
progenitor(misael, yesenia).

Y en prolog podemos hacer las siguientes preguntas!
¡ojo! al final de cada pregunta se tiene que porner el punto "."
porque si no, no funciona.

?- progenitor(miguel, marco).
?- progenitor(yesenia, misael).
?- progenitor(X, misael)
?- progenitor(camilo, X).
?- progenitor(X,Y).











miércoles, 10 de diciembre de 2014

Métodos para la solución de problemas

Antes de empezar, quiero dar mi punto de vista sobre que es la IA. Y empiezo definiendo por partes cada concepto.

Que es La inteligencia?
Desde mi punto de vista, la inteligencia es la forma o habilidad Que tenemos los seres humanos de poder Pensar, Razonar, de Aprender o de tener una lógica, de tal manera que es muy Sobresaliente y Sorprendente.

¿Que es lo Artificial?
Intuitivamente Como ya lo había mencionado, Lo Artificial es lo Contrario De lo Natural.
Es decir, Si tenemos Una flor, Una Rosa Digamos, Podemos crear una Rosa Artificial Casi Igual a Una Rosa Natural, La diferencia Entre la Rosa Natural Y la Rosa Artificial, Sería que: Esta hecha De otro material, Es mas Duradera, Tiene otro olor, No necesita de agua. Etc.
En otras palabras diría; Que no Es Natural.!
Pero que Tienen Casi La misma Apariencia Físicamente.

Ahora Combinando Estos Dos Conceptos, Sobre
¿Que Es la Inteligencia Artificial?
Teniendo en Cuenta Los Anteriores Conceptos, Puedo Deducir que es la manera De pensar, Aprender, crear, etcétera. De una Forma No natural, Es decir, Que hay Computadoras Que pueden Hacerse Pasar Como Personas Razonables(que pueden Pensar por si solas) y que tienen capacidades Intelectuales Como las personas.
Pero sin Olvidar Que todo Es totalmente Programado. Es decir, Las computadoras No son Mas inteligentes que las personas. Porque Son las Mismas personas las Que Programaron un Software para que pueda realizar y ejecutar Tareas.

Algo que quiero Agregar También Que creo yo que puede ser muy relevante, es que hace unos 2 años, leí un articulo donde Explicaba que en el año 2050 habrá una computadora Capaz De Realizar Acciones por si sola parecidas a las de la persona


Métodos para la solución de problemas
leyendo sobre lo que era la solución de problemas encontré que es la forma o técnica de encontrar la solución a un problema dado, y que podemos crear un programa capaz de resolver ese problema.

En el libro de inteligencia artificial viene el problema de los tres bloques que se tiene que resolver moviendo un bloque cada vez, un bloque puede levantarse únicamente cuando no tiene nada encima, el bloque levantado puede colocarse sobre el piso ó sobre otro bloque.




El problema del rompecabezas
El problema consiste de una tabla de 3x3 celdas conteniendo ocho números del 1 al 8 y
una celda vacía. Como son ocho números, una celda siempre permanecerá vacía; un
número puede ‘moverse’ a una celda adyacente si ésta está vacía, dejando vacía la celda
donde se encontraba; el problema consiste en ordenar los números del 1 al 8 en forma
circular dejando la celda central vacía tal y como se muestra en la figura 2.3.

El problema del juego de ajedrez
Si queremos escribir un programa para jugar ajedrez, podríamos, en primer lugar,
especificar cuál es la posición inicial de las piezas en el tablero, cuáles son las reglas que
definen los movimientos legales y qué posiciones de las piezas representan la victoria
tanto para un jugador como para el otro.
La posición inicial y en general cualquier posición, puede describirse con una tabla de
8x8 elementos.
La meta es una posición del tablero en la cual el jugador contrario tenga su rey
amenazado y no pueda realizar ningún movimiento legal para quitarse la amenaza.
Los movimientos legales son la forma de pasar, desde un estado inicial a un estado meta
y pueden describirse como un conjunto de reglas del tipo "si X entonces Y" donde 'X' y
'Y' son posiciones legales del tablero y significa que se puede 'pasar' del estado 'X' al
estado 'Y' :