i.a. listas en prolog parte ii. sección domains tiene básicamente 2 propósitos: dar nombres...
TRANSCRIPT
![Page 1: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/1.jpg)
I.A.
Listas en PrologParte II
![Page 2: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/2.jpg)
Sección Domains
Tiene básicamente 2 propósitos:Dar nombres significativos a los dominios,
a pesar de que internamente sean los mismos dominios que ya existen.
Declarar dominios que no son estandares.
![Page 3: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/3.jpg)
Ejemplo Francisco es un varón de 30 años. Podría presentarse por el predicado: persona(francisco,varon,30). El predicado persona se hubiera declarado en la sección
predicates de la siguiente forma:persona(symbol,symbol,integer)
Ejemplo: domains nombre, sexo = symbol edad = integer predicates persona(nombre,sexo,edad)
![Page 4: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/4.jpg)
Aridad Múltiple
La aridad de un predicado es el número de argumentos que utiliza.
Se puede tener dos predicados en el mismo nombre pero diferente aridad y por tanto diferente significado.
![Page 5: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/5.jpg)
Ejm
domains persona=symbol predicates padre(persona) %persona es el padre padre(persona,persona)%primera persona es padre de la
segunda persona clauses padre(alejandro,zarahi). padre(marco,alejandra). padre(luis,pedro). padre(P):-padre(P,_). %regla que reemplaza a la
definición particular goal padre(P,H). %cada padre con su respectivo hijo
![Page 6: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/6.jpg)
P=alejandro, H=zarahiP=marco, H=alejandraP=luis, H=pedro3 Solutionspadre(P) establece una particularidadpadre(P,_) establece un propiedad o regla
![Page 7: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/7.jpg)
goal
padre(P,_). %quienes son padresogoal
padre(P). %quienes son padres
![Page 8: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/8.jpg)
P=alejandroP=marcoP=luis3 Solutions
![Page 9: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/9.jpg)
Unificación
Visual Prolog busca soluciones de arriba a bajo. Cuando encuentra una cláusula que coincide con la consulta u objetivo, instancia valores para las variables libres de tal forma que la meta y la cláusula se hacen idénticas. A este evento se denomina unificación.
![Page 10: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/10.jpg)
domains titulo,autor=symbol paginas=integer predicates libro(titulo,paginas) escrito_por(titulo,autor) novela_larga(titulo) clauses libro("María",120). libro("La Iliada",300). escrito_por("María","Isaacs"). escrito_por("La Iliada","Homero"). novela_larga(Tit):-libro(Tit,Pag),Pag>150.
%novela larga si cumple goal escrito_por(T,A).
![Page 11: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/11.jpg)
T=María, A=Isaacs T=La Iliada, A=Homero 2 Solutions Primero busca en cláusulas que los predicados
sean iguales, escrito_por, a partir de la tercera cláusula. La meta y la clausula han sido unificadas: T a instanciado el valor “María” y A instanciado el valor “Isaacs”. A continuación el Prolog sigue buscando, libera las variables y continua buscando, luego las variables se vuelven a instanciar T=La Iliada, y A=Homero, por lo tanto reporta 2 soluciones.
![Page 12: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/12.jpg)
goal novela_larga(X). X=La Iliada 1 Solution Objetivo es novela_larga(X), el Prolog,
comienza a busca en las clausulas, coincide con la regla, vincula X con Tit, por lo tanto la novela es larga si cumple, por ello analiza si cumple los sub objetivo de izquierda a derecha:
libro(Tit,Pag) ubica e instancia los valor a las variables Tit<-“María” y Pag<- 120,
![Page 13: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/13.jpg)
Pag > 150 ; 120>150 falso, por lo tanto rechaza lo ubicado, liberando las variables para otro proceso de búsqueda.
libro(Tit,Pag) ubica otro e instancia los valor a las variables Tit<-“La Iliasda” y Pag<- 300,
Pag > 150 ; 300>150 verdad, por lo tanto el cuerpo de la regla se hace verdadero, por lo tanto la cabecera también se hace verdadera.
Prolog remite como solución a La Iliada dado que X=Tit.
![Page 14: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/14.jpg)
Vuelta Atrás (BackTraking)
Para encontrar soluciones, Visual Prolog utiliza una técnica llamada “Backtracking” que consiste en probar diferentes caminos si fracasa en uno de ellos, regresa a un nivel anterior y prueba con otro.
![Page 15: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/15.jpg)
Cuando inicia un intento para satisfacer un objetivo, comienza desde la primera cláusula en búsqueda de una coincidencia.
![Page 16: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/16.jpg)
Cuando una nueva llamada se produce, la búsqueda para esa llamada también comienza desde la primera cláusula.
Una vez que una variable ha sido instanciada, la única forma de liberarla es a través de la vuelta atrás
![Page 17: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/17.jpg)
En objetivos compuestos, sólo se pasa al siguiente sub objetivo si el anterior ha sido exitoso.
Obj:-obj1,obj2,obj3,obj4, trata de cumplir los objetivo de izquierda a derecha, tendría que ir cumpliendo objetivo x objetivo.
![Page 18: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/18.jpg)
predicates gusta(symbol,symbol) sabe(symbol,symbol) comida(symbol) clauses comida(tallarin). comida(estofado). sabe(tallarin,mal). sabe(estofado,bien). gusta(juan,X):-comida(X),sabe(X,bien). goal gusta(juan,C). C=estofado 1 Solution
![Page 19: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/19.jpg)
Primera Busqueda
gusta(juan,C)
gusta(juan,X)
comida(X)
Comida(tallarin) [V]
sabe(X,bien)
tallarin, bien [F]
![Page 20: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/20.jpg)
Segunda Busqueda
gusta(juan,C)
gusta(juan,X)
comida(X)
Comida(estofado) [V]
sabe(X,bien)
estofado, bien [V]
![Page 21: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/21.jpg)
Predicado FAIL
Prolog inicia la vuelta atrás cuando una llamada falla.
Se utiliza el predicado “fail” para producir una falla y por ende forzar a que se realice la vuelta atrás, en busca de otras soluciones.
Ejemplo a)
![Page 22: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/22.jpg)
Ejemplo 13 domains nombre=symbol predicates padre(nombre,nombre) todos clauses padre(leonardo,katty). padre(carlos,jaime). padre(carlos,maria). todos:-padre(X,Y),write(X,"es padre de",Y,"\n"). (regla) goal padre(X,Y). X=leonardo, Y=katty X=carlos, Y=jaime X=carlos, Y=maria 3 Solutions
![Page 23: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/23.jpg)
La idea es que el prolog buscará todas las condiciones que cumplan
Ejemplo b)goal
todos.
leonardo es padre de katty
yes
La idea es que con goal todos, una vez que cumple la regla el prolog para la búsqueda.
![Page 24: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/24.jpg)
Forzando a una falla
Ejemplo c)todos:-padre(X,Y),write(X," es padre de ",Y,"\
n"),fail. goal todos. leonardo es padre de katty carlos es padre de jaime carlos es padre de maria no -> porque a fallado al final.
![Page 25: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/25.jpg)
Ejemplo d) todos:-padre(X,Y),write(X," es padre de ",Y,"\
n"),fail.todos.
goal todos.
leonardo es padre de kattycarlos es padre de jaimecarlos es padre de mariayes
![Page 26: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/26.jpg)
Corte
Se usa para evitar la vuelta atrás.
Se representa por !
![Page 27: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/27.jpg)
Una vez que el corte ha sido ejecutado, es imposible volver atrás en las submetas ubicadas antes del corte en la cláusula que esta siendo procesada y tampoco es posible volver atrás a otros predicados similares al que se está ejecutando.
![Page 28: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/28.jpg)
Regla: r:-a,b,!,c,d,e.
Una vez que verificado los predicados o submetas a,b pasa por el corte y comienza a ver los predicados c,d,e, no pudiendo regresar a verificar los predicados a y b, ni mucho menos a la regla r.
![Page 29: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/29.jpg)
Ejmpredicates
amigo (symbol,symbol)
mujer(symbol)
gusta(symbol,symbol)clauses
mujer(maria).
mujer(juana).
mujer(susana).
gusta(javier,futbol).
gusta(benjamin,susana).
![Page 30: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/30.jpg)
amigo(benjamin,juana):-mujer(juana),gusta(benjamin,juana),!.
amigo(benjamin,javier):-!,gusta(javier,futbol),!.
amigo(benjamin,susana):-mujer(susana).
Goal amigo(benjamin,X).
![Page 31: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/31.jpg)
X=javier1 Solution
![Page 32: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/32.jpg)
Otro ejemplo
predicates literal(byte)clauses literal(X):-X=1,write(X," = uno \n"). literal(X):-X=2,write(X," = dos \n"). literal(X):-X=3,write(X," = tres \n"). literal(X):-write(X," = sorpresa \n").goal literal(1).
![Page 33: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/33.jpg)
1 = uno yes
![Page 34: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/34.jpg)
Agregando
literal(X):-X=1,write(X," = uno \n"),fail.Solucion:
1 = uno 1 = sorpresa
yes
![Page 35: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/35.jpg)
Listas
Ejemplos
![Page 36: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/36.jpg)
Ingreso de datos en una lista domains i=integer li=i* predicates nondeterm ingreso(i,li) nondeterm leer clauses ingreso(0,[]). ingreso(N,L):- N1=N-1, ingreso(N1,L1), write("Ingrese Numero= "), readint(E), L=[E|L1]. leer:- write("Ingrese N= "),readint(N),N>0, ingreso(N,L), write("Lista ","\n",L),nl. goal leer, readln(_).
![Page 37: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/37.jpg)
Dominios Complejos en Prolog
![Page 38: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/38.jpg)
Se denominan también a los dominios complejos estructuras de datos definidas por el usuario, por ejm podría definir el dominio estándar INTEGER pero si quisiera definir un dominio ENTERO el compilador no sabia de que se trata si antes no lo defino previamente.
![Page 39: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/39.jpg)
Cada sección de dominios debe comenzar con la palabra DOMAINS. Ejemplo:
DOMAINS ENTERO = INTEGER
![Page 40: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/40.jpg)
El formato es como sigue: dominio = [reference] [align {byte|word|dword}]
declaracion1;[declaracion2];... dominio: nombre especificado por el usuario. declaracion1; [declaracion2]: declaración de
objetos compuestos alternativos que tienen que tener la forma siguiente: functor([sub_1 [, sub_2, ...] ])
![Page 41: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/41.jpg)
dondefunctor es el nombre del objeto compuesto
alternativo.sub_1 [,sub_2, ...] son subcomponentes
del objeto compuesto que deben tener su correspondiente nombre y dominio. Este último puede ser estándar o definido por el usuario.
![Page 42: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/42.jpg)
reference: indica la declaración de un dominio de referencia. En este tipo de dominios los argumentos de entrada pueden ser variables libres.
align: indica el tipo de distribución de memoria que se va a usar.
![Page 43: I.A. Listas en Prolog Parte II. Sección Domains Tiene básicamente 2 propósitos: Dar nombres significativos a los dominios, a pesar de que internamente](https://reader035.vdocuments.pub/reader035/viewer/2022062511/54f499d64a7959c9338b4730/html5/thumbnails/43.jpg)
Ejmplo
DOMAINSLECTOR = lee(SYMBOL Nombre, LECTURA Item)
LECTURA = libro(SYMBOL Autor, SYMBOL Titulo,
SYMBOL Editorial);
revista (SYMBOL Titulo, INTEGER Numero)