Lengupro 4 - Unidad 3

November 18, 2022 | Author: Anonymous | Category: N/A
Share Embed Donate


Short Description

Download Lengupro 4 - Unidad 3...

Description

 

3. Prolog  

Objetivo general

Aprender como se puede representar conocimiento en prolog. Objetivos específicos

Aprender las nociones básicas del prolog. Aplicar la lógica de primer orden en un lenguaje de programación declarativo lógico. Es un le leng ngua uaje je de decl clar arat ativ ivo o e in inte terp rpre reta tado do,, en este este titipo po de le leng ngua uaje jess se representan los conocimientos sobre un determinado dominio y sus relaciones. A partir de ese conocimiento, se deducen las respuestas de las preguntas que se formularon, es decir se obtiene una inferencia. Prolog es un lenguaje de programación que se utiliza mucho para resolver  problemas que implican objetos y relaciones entre objetos. Está basado en la coincidencia sintáctica, estructuras de datos basadas en árboles, backtracking automático, declara hechos sobre objetos y sus relaciones, hacer preguntas sobre objetos y sus relaciones y definir reglas sobre objetos y sus relaciones. El conocimiento se formaliza mediante un conjunto de relaciones que describen las propiedades y sus iteraciones. Se declara el conocimiento disponible de: •



Objetos Propiedades. o o Relaciones. Reglas, las cuales determinan interacciones lógicas del tipo: si ocurre q, r, s y t entonces p.

Una ventaja es que no hay que preocuparse del cómo resolver algo, una desventaja es que la resolución no siempre es eficiente. Un programa en prolog esta constituido por un conjunto de cláusulas de Horn, tiene la siguiente forma: p(t1, t2, t3,……, tn):-p1(…..),……,pm(…..) con m>=0 Tanto p como los pi son símbolos predicados con sus argumentos entre paréntesis, los argumentos de un predicado reciben el nombre de términos. Las cláusulas de Horn son expresiones condicionales, donde el símbolo :- es el símbolo condicional o de implicación (en lógica se utiliza el símbolo ←), la cláusula anterior se lee de la siguiente manera: Si p1(….) Y p2 (…..) Y……Y pm(…..) Entonces p(t1,t2,….,tm) También se podría leer:

 

Es Cierto p(t1,t2,…,tm) Si es Cierto p1(…) Y Es Cierto p2(…) Y…. Y Es Cierto pm(….) Cuando m=0, no tiene parte derecha se trata de un hecho o afirmación. p(t1,t2,….,tm) Cuando no tiene parte izquierda, se tiene una cláusula negativa o pregunta, estas se utilizan para realizar la entrada y salida del programa: ?p1(…),p2(…),…,pm(…) Un término ti puede ser: • • •

Un átomo (número, constante). Una variable. Una estructura (functor): f(t1,t2,…,tm), donde los argumentos ti son a su vez términos.

La sintaxis estándar del prolog (sintaxis de Edimburgo), los símbolos de átomos (constantes), “functores” y predicados comienzan con una letra minúscula, los símbolos de variables comienzan con una letra mayúscula. 3.1. Cláusulas

Los programas en prolog están constituidos por cláusulas, estas representan todo el conocimiento necesario para resolver el problema. Se diferencian 3 tipos de cláusulas: •

Hechos (afirmaciones), representan: Objetos. o o Propiedades de objetos. o

• •

Reglas.Relaciones entre objetos. Consultas (cláusulas negativas).

Un programa en prolog es una secuencia de cláusulas, donde cada cláusula puede estar formada por uno o varios predicados. Todas las cláusulas terminan en punto. 3.2. Términos

Hay tres tipos de términos: •

Constante: Átomo: en minúsculas, ejemplo luis o Entero: solo dígitos y el +,o

 

Real: dígitos el +,-,. Variable: comienzan con mayúscula o con _ ejemplo Suma X _Y Estructura: termino compuesto por otros términos ejemplo edad(luis,63) padre_de(luis,eva) o

• •

3.3. Hechos

Es el mecanismo básico para representar: • • •

Objetos/personas/conceptos. Propiedades de los objetos. Relaciones entre los objetos.

Ejemplo:

padre(Luis). padre_de(Luis, Pedro). azul(Cielo). Una rel relaci ación ón est esta a defini definida da por todas todas las ins instan tancia ciass que apare aparecen cen co con n un predicado. Tipo de concepto Objetos/personas/concepto s Propiedades Relaciones

Ejemplo Luis Pedro Cielo Padre Azul Padre_de

Aridad Predicado/0 Predicado/1 Predicado/2,…,/n

Los hechos se introducen en la base de hechos del intérprete de prolog mediante una aserción: ?-assert(padre_de(Luis, Pepe)). Ejemplos de base de hechos:

amigos (Pedro, Antonio). amigos (Pedro, Flora). amigos (Pedro, Juan). amigos (Pedro,Vicente). amigos (Luis, Felipe). amigos (Luis, Maria). amigos (Luis, Vicente). amigos (Carlos, Paloma).

 

amigos (Carlos, Lucia). amigos (Carlos, Juan). amigos (Carlos, Vicente). amigos (Fernando, Eva). amigos (Fernando, Pedro). millonario(Pedro) millonario(Antonio) millonario(Flora) soltero(Pedro) soltero(Flora) soltero(Eva) soltero(Luis) padre_de(Carlos, Fernando). padre_de(Antonio, Maria). padre_de(Antonio, Carlos). 3.4. Consultas

Es la forma para extraer conocimiento del programa: ?-amigos(Pedro, Antonio). ?-amigos(Pedro, Eva). ?-amigos(Pedro, Pepe). ?-amigos(Pedro, X). ?-amigos(Antonio, Pedro). Ejemplo:

Mi amigo Vicente, busca amigos/as de mis amigos que sean millonarios/as y estén solteros/as. ?-amigos(X,Vicente),amigos(X,Y),millonario(Y),soltero(Y). Una consulta estará constituida por una o varias metas que prolog deberá resolver. El intérprete de prolog devolverá más soluciones si se utiliza punto y coma, si no existen más soluciones el interprete arroja no. 3.5. Equiparación

Permite comprobar si dos expresiones son equivalentes, el resultado es una sustitución de términos cuando esta es posible. Por ejemplo, en el caso de que una variable este libre y es equiparada con un valor numérico, se obtiene una instanciación (asignación) de la variable con dicho valor. Ejemplos:

amigos(Pedro, Vicente) y amigos(Pedro, Vicente)

 

Son equiparables amigos(Pedro, Vicente) y amigos(X,Vicente) Son So n eq equi uipa para rabl bles es X= X=Pe Pedr dro o amigos(Pedro,Y) y amigos(X, Vicente) Son equiparables X= Pedro Y= Vicente amigos(X,X) y amigos(Pedro, Vicente) no son equiparables porque X= Pedro y X= Vicente no es posible Dos términos T1 y T2 son equiparables si: • •



T1, T2 son constantes => idénticas T1 o T2 es una variable => se equiparán instanciando el otro termino a la variable T1, T2 so son n es estr truc uctu tura rass => los los té térm rmin inos os qu que e lo loss co comp mpon onen en so son n equi eq uipa para rabl bles es ma mant nten enie iend ndo o una una inst instan anccia iaci ción ón de la lass va vari riab able less coherentes.

3.6. Reglas

Establecen relaciones más elaboradas entre objetos, por ejemplo, relaciones generalizadas o particularizadas, relaciones causa-efecto. 3.7. Esquema condicional

En prolog la “y” lógica corresponde a la “,” y la o lógica corresponde a la definición de varias cláusulas para el mismo predicado. Esto es equivalente a usar “;”. Ejemplo:

P:-a,b. P:-c,d.

P:-(a,b;c,d).

Ambas definiciones son equivalentes Ejemplo:

hijo_de(X,Y):-padre_de(Y,X). familiares(X,Y):-padre_de(X,Y). familiares(X,Y):-padre_de(Y,X). 3.8. Reglas recursivas

La recursión es una técnica fundamental en Prolog, tanto para representar los datos comorepetitivas. para procesarlos. Esto se debe ya que en prolog no existen las estructuras

 

Para definir reglas más generales y flexibles, es necesario un mecanismo adicional, para esto se utiliza la recursividad, ejemplo: antecesor_de(X,Y):-padre_de(X,Y). antecesor_de(X,Y):-padre_de(X,Z),padre_de(Z,Y). antecesor_de(X,Y):-padre_de(X,Z1),padre_de(Z1,Z2), antecesor_de(X,Y):-padre_de (X,Z1),padre_de(Z1,Z2), padre_de(Z2,Y). antece ant ecesor sor_d _de(X e(X,Y) ,Y):-p :-padr adre_d e_de(X e(X,Z1 ,Z1),p ),padr adre_d e_de(Z e(Z1,Z 1,Z2), 2), pad padre_ re_de( de(Z2, Z2,Z3) Z3) padre_de(Z3,Y).

,

La primera línea me devuelve el nombre del papá, la siguiente la del abuelo, la siguiente el bisabuelo y la última el tatarabuelo. Pero esta manera no es eficiente, dado que no permite generalizar el concepto de antecesor. Prolog permite definir recursividad: antecesor_de(X,Y):-padre_de(X,Y). antecesor_de(X,Y):-padre_de(X,Z),antecesor_de(Z,Y). 3.9. Desigualdad

Para Par a com compro probar bar si dos términ términos os son dis distin tintos tos,, se dis dispon ponen en de dif difere erente ntess operadores. Desigualdad: \== Compru Com prueba eba si dos tér términ minos os son dis distin tintos tos,, eje ejempl mplo o si dos var variab iables les tienen tienen distintos valores de instancia. Desigualdad aritmética: =\= Verifica la desigualdad numérica entré dos expresiones. Ejemplos:

Hermanos(X,Y):-padre_de(Z,X),padre_de(Z,Y),X\==Y. 3.10. Operadores de comparación

< >= 3.11. Operadores y funciones aritméticas

+ Suma - Resta * Multiplicación ^ Potencia / División decimal //mod División entera Residuo de una división entera

 

abs valor absoluto max valor máximo entre dos números min valor mínimo entre dos números round redondea al entero más próximo integer trunca a la parte entera float convierte en un valor real 3.12. Igualdad y asignación

Se disponen de 4 tipos de igualdad: •







Ig Igua uald ldad ad ar aritm itmét étic ica: a: =: =:= = comp compru rueb eba a la ig igua uald ldad ad numé numéric rica a de la lass expresiones argumento. igual1(X,Y):-X=:=Y. Identidad: == comprueba si los términos argumento son iguales. igual2(X,Y):-X==Y Unific Uni ficac ación ión:: = compru comprueba eba si los tér términ minos os argume argumento nto son un unific ificabl ables es (equiparables). Es equivalente a la asignación directa entre variables en un lenguaje procedimental. Genera errar si la unificación no es posible. igual3(X,Y):-X=Y. Una definición equivalente sería: igual4(X,X). Asignación: is evalúa la segunda expresión e intenta asignar el valor  obtenido a la variable, no es conmutativo. incremento(X,Y):-Y is X+1. Una definición similar a la de igualdad sería: igual5(X,Y):- X is Y.

A continuación se muestra una tabla comparativa de todas las posibilidades existentes: Operador Ejemplo Igual?(3,3).

=:= igual1 yes

== igual2 Ye s

= igual3 Ye s

= igual4 Ye s

is igual5 Ye s

IIg gu ua all? ?((1 1,+32),.3). Igual?(3,1+2). Igual?(X,1+2). Igual?(1+2,X). Igual?(3,X). Igual?(X,3). Igual? (‘hola’,’hola’). Igual?(1.0,1). Igual?(1,1.0). Igual?(1.0,1.0). Igual?(1.1,1.1).

N Yeos Yes * * * * **

No o N No No No No No Ye s

No o N No X=1+2 X=1+2 X=3 X=3 Ye s

No o N No X=1+2 X=1+2 X=3 X=3 Ye s

No o N Ye s X=3 * * X=3 Ye s

Yes Yes Yes Yes

No No Ye s Ye s

No No Ye s Ye s

No No Ye s Ye s

No*** Yes*** Mo*** Yes***

*Excepción: X libre.(o expresión) válida. **Error: ‘hola’variable no es función

 

***prolog tiene tendencia a convertir valores reales en enteros. En el segundo argumento del operador “is” detecta que se puede convertir a entero. 3.13. Negación

not está implement implementado ado como nega negación ción por fallo, quiere quiere decir que se evalú evalúa a como falso cualquier cosa que prolog no este en capacidad de verificar que su predicado argumento es cierto. Ejemplo:

saldo_cuenta(maria,1000). saldo_cuenta(flora,3000000). saldo_cuenta(Antonio,2000000). padre_de(Antonio,maria). millonario(X):-saldo_cuenta(X,Y),Y>1000000. pobre(X):-not millonario(X) 3.14. Backtracking

Es el mecanismo que incorporan los sistemas de programación lógica para enco en cont ntra rarr Este re refu futa taci cion ones es de dent ntro ro del delprobar es espa paci cio o de opciones bú búsq sque ueda dacuando as asoc ocia iado dotermina a un programa. mecanismo permite nuevas se una derivación con o sin éxito (reevaluación). Esto consiste en retroceder desde un nodo terminal de un árbol de búsqueda hasta el último nodo con alguna rama no explorada deshaciendo las ligaduras establecidas a partir de ese nodo. La reevaluación la realiza automáticamente el sistema después de una derivación sin éxito, y el usuario la puede provocar  después de una derivación con éxito. Con estos mecanismos, el lenguaje de cláusulas de Horn se puede tomar como lenguaje de programación y el significado de un programa será el conjunto de to toda dass la lass re rela laci cion ones es de demo most stra rable bless entre entre todo todoss lo loss ob obje jeto toss de dell prog progra rama ma (semántica operacional). 3.15. Semántica operacional de prolog

Un programa en prolog se ejecuta de la siguiente manera: • •

El programa que son hechos y reglas. Un motor de inferencia.

El motor de inferencia, es un mecanismo de invocación de procedimientos.

3.16. Salida del intérprete

 

halt/0

Termina la ejecución del intérprete Prolog, cerrando todos los ficheros abiertos. halt(+Status)

Termina la ejecución del intérprete con un determinado estado, el estado es un número entero. 3.17. Entrada y Salida Estándar 

A conti continuaci nuación, ón, se mues muestran tran algunos predicado predicadoss básic básicos os para poder realiz realizar  ar  oper op erac acio ione ness de entra entrada da/s /sal alid ida a de desd sde/ e/so sobr bre e el term termina inall de sali salida da de la computadora. current_op(?P (?Prec recede edence nce,?T ,?Type ype,?N ,?Name ame): ): Devuel Devuelve ve éxi éxito to cua cuando ndo Nam Name e est está á

definido defini do como como un operad operador or de tipo tipo Type Type cuya cuya pre preced cedenc encia ia es Pre Preced cedenc ence. e. (Otros predicados relacionados con este, op/3). display(+T (+Term) erm):: Es Escr crib ibe e el té térm rmin ino o Ter erm m sob obre re la salilid da está están nda darr del

dispositivo. Este predicado suele emplearse normalmente para examinar la representación interna de un término. flush: Vuelca la salida de un programa sobre la salida estándar actual (ver  flush_output/1 ). get(-Char): Lee de la entrada actual caracteres y unifica Char con el próximo

carácter introducido (distinto al carácter blanco). Char se unifica con -1 si se trata del final de un fichero. get0(-Char): Lee de la entrada actual caracteres y unifica Char con el próximo

carácter introducido. Char se unifica con -1 si se trata del final de un fichero. nl: Escrib Escribe e una lín línea ea en blando blando (cará (carácte cterr new newlin line) e) sob sobre re la salida salida est estánd ándar  ar 

actual . op(+Prec (+Precedenc edence,+Ty e,+Type,+N pe,+Name): ame): Declara a Name como un opera operador dor de tipo

Type con una precedencia Precedence. put(+Char): Escribe el carácter Char sobre la salida estándar del dispositivo. read(-Term): Lee un término desde la entrada estándar del dispositivo. skip(+Char): Lee y salta caracteres desde la entrada estándar hasta que

encuentra el carácter Char. tab(+Amount): Escribe un número dado (Amount) de espacios en blanco en la

salida est salida estánd ándar ar del dis dispos positiv itivo o (Am (Amoun ountt debe debe ser una exp expres resión ión que pue pueda da evaluarse como un entero positivo). write(+Term): Escribe el término Term sobre la salida estándar.

 

writeq(+Te (+Term rm): ): Escr Escrib ibe e el té térm rmino ino Te Term rm sobr sobre e la sali salida da es está tánd ndar ar (sitú (sitúa a el

término entre comillas). En este predicado, los términos pueden ser vueltos a leer con el predicado read/1. 3.18. Entrada y Salida desde Fichero close(+Stream): Cierra el fichero especificado por Stream. display(+S (+Stre tream, am,+Te +Term): rm): Mue Muestr stra a un términ término o Ter Term m que se enc encuen uentra tra en el

fichero especificado por Stream. get(+Stream, -Char): Lee el siguiente carácter imprimible de un fichero y unifica su correspondiente valor ASCII con Char. get0(+Stream, -Char): Lee el siguiente carácter de un fichero y unifica su

correspondiente valor ASCII con Char. nl(+Stream): Escribe una línea en blanco en el fichero especificado. open(+SrcDest,+Mode,?Stream): Apertura del fichero especificado por SrcDest

(especific (espec ifica a un fic ficher hero o Unix), Unix), el Mode Mode puede puede ser de lec lectur tura a (re (read) ad),, esc escrit ritura ura (write) o para realizar una ampliación del mismo (append). El término Stream puede ser una variable (se instanciará a un entero que identifica mi fichero), o un átomo (en este caso se trata de un identificador de fichero). En caso de no existir el fichero lo crea. put(+Stream,+Char): Escribe el carácter Char, en el fichero Stream. read(+Stream,-Term): Lee un término desde un fichero. see(+SrcDest): Abre un fichero para lectura y se sitúa al comienzo del mismo. seeing(?S (?SrcD rcDest est): ): Unific Unifica a el nom nombre bre del ficher fichero o abi abiert erto o ac actua tualme lmente nte con

SrcDest . seen: Cierra el fichero actualmente abierto, y devuelve la entrada estándar del

dispositivo al teclado del terminal. skip(+Stream,+Char): Lee y salta caracteres desde un fichero (Stream) hasta

que encuentra el carácter Char. tab(+Stream,+Amount): Escribe un número dado (Amount) de espacios en

blanco un fichero (Stream). tell(+SrcDest): Abre un fichero para escritura como si se tratase de la salida

estándar. telling(?SrcDest): Devuelve el nombre de el fichero abierto por  tell (unifica el

nombre del actual fichero de salida con SrcDest). told: Cierra el fichero que se encuentre actualmente abierto, y devuelve la salida estándar del dispositivo a la pantalla del terminal.

 

write(+Stream,+Term): Escribe el término Term sobre el fichero Stream. writeq(+T (+Term erm): ): Esc Escrib ribe e el tér términ mino o Term Term sobre sobre el fic ficher hero o Str Stream eam (los ins insert erta a

entrecomillados). 3.19. Funciones del Sistema [+Fil Filesp espec] ec]:: Lee las cláusu cláusulas las conte contenid nidas as en el fic ficher hero o es espec pecific ificado ado y las

inserta en la base de datos (es una acción similar a ejecutar el predicado consult). chdir (+Path): (+Path): Cambia el directorio de trabajo al directorio Path.

consult(+File): Lee un fichero con formato Prolog (el fichero va sin extensión

aunque por def aunque defect ecto o buscar buscará á el fic ficher hero o File File o File File.pl .pl,, tom toma a las cláus cláusula ulass que encuentre en ese fichero y las inserta en la base de datos delete_file(+File): Borra el fichero especificado. exists_file(+File): Produce éxito cuando el fichero especificado existe (esto no

implica que el usuario disponga de permiso de lectura o escritura sobre ese fichero). halt: Finaliza la ejecución del intérprete de Prolog o de la aplicación compilada. listing: Lista todos los predicados de la base de datos. listing(+Pred): Lista todos los predicados especificados por Pred. rename_file(+File1,+File2): Renombra File1 como File2. size_file(+F (+File ile,-S ,-Size ize): ): Uni Unific fica a la var variab iable le Siz Size e con el núm número ero de caract caractere eress

contenidos en File. shell: Inicia un shell interactivo con Unix. El shell finaliza al teclear exit. shell(+Command): Ejecuta un comando de Unix. statistics: Mues Muestr tra a una una ta tabl bla a con con info inform rmac ació ión n esta estadí díst stic ica a ac acer erca ca de la

utilización del sistema. 3.20. Funciones para la Depuración de Programas Pr ogramas debug: Arranca el depurador (detendrá la ejecución de los programas en los

puntos espías). debugging: Imprime el estado del depurador y los puntos espías sobre la

salida actual. nodebug: Detiene el depurador (quita el modo traza y no se detiene en ningún punto espía).

 

nospy(+Pred): Borra el punto espía situado en el predicado especificado. nospyall: Borra todos los puntos espía del programa. notrace: Detiene el proceso de traza del programa. spy(+Pred): Sitúa un punto espía en el todos los predicados especificados por 

Pred. trace: Arranca el proceso de traza del programa. tracing: Devuelve éxito cuando el proceso de traza está activado.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF