0% encontró este documento útil (0 votos)
50 vistas

Prolog

Las 3 oraciones resumen lo siguiente: 1) El documento describe el lenguaje de programación lógica Prolog. 2) Explica brevemente la historia y desarrollos de la programación lógica, desde los años 1960 hasta la actualidad. 3) Señala las características clave de la programación lógica como la unificación, inferencia automática y recursividad.

Cargado por

hate2
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
50 vistas

Prolog

Las 3 oraciones resumen lo siguiente: 1) El documento describe el lenguaje de programación lógica Prolog. 2) Explica brevemente la historia y desarrollos de la programación lógica, desde los años 1960 hasta la actualidad. 3) Señala las características clave de la programación lógica como la unificación, inferencia automática y recursividad.

Cargado por

hate2
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 22

Programación Lógica

Prolog

Jesús Correas Fernández


[email protected]
Despacho D-2205
Departamento de Inteligencia Artificial
Facultad de Informática
Universidad Politécnica de Madrid
28660-Boadilla del Monte, Madrid 17 de julio de 2002

Programación Lógica PROLOG

Bibliografı́a y enlaces

Sterling, L. y Shapiro, E. “The Art of Prolog” (Segunda edici ón) MIT Press, 1994.
Bratko, I. “Prolog Programming for Artificial Intelligence” (Segunda edici ón)
Addison-Wesley Ltd. 1990.
Enlaces
 Repositorios, bibliografı́a, compiladores, etc.:
 

      

 ! "
#$%&
' (#"$'!$#)
'
*+,
#$*$ ,
-./*
 

    021 3/4
*$,"'(#$ ,

 

   *'567"' 37'89  
*$ ,':#$&,#;'<+,:#"$'!$#"'=>*
 

   *'567"' 37'89  
?5#$ ,"*$ ,

 Ciao Prolog:
6

&   @ *'5 A"' 37"'/ 
B$ #
C'$
'2+ DE>F* G' $
 Prolog de libre distribución, para WINDOWS 95, NT, etc. y MS-DOS):
6

&   @0! H'>H)E>I./+F*
#$%&"
B&JHK (L#$*$ ,
$& +*$M>*

Transparencias, tarjeta de referencia de Emacs, etc.:


NOPO;QSR2TPTU8U8UWVXPY=ZQSV<[MZ\]V<^MZ_V `8QPaSV5b=c;T=de=X;fHg8gb\cHT"Q3gf8YPfFh=T

Programación Lógica PROLOG


INTRODUCCION

Lógica y Computación

programming
logic
algorithms
verification logic and AI

logic programming knowledge representation

constraints logic of programming

declarative programming

Logic of Computation Computational Logic


program verification direct use of logic
proving properties as a programming tool

Programación Lógica PROLOG

Uso de la lógica (I)

?
Uso convencional de los ordenadores – No es f ácil determinar la correcci ón de
los programas

Programación Lógica PROLOG


Uso de la lógica (II)

?
Logic YES / NO

Visión tradicional de la lógica: nos permite razonar sobre la correcci ón de los
programas

Programación Lógica PROLOG

Uso de la lógica (III)

But, it would be interesting


to also improve:

?
Logic YES / NO

La lógica nos permite representar problemas


Pero también resolverlos!

Programación Lógica PROLOG


Aproximaciones a la computación

Aproximación imperativa
\ Basada en secuencias de instrucciones a ejecutar
\ Especificación “bottom-up” a partir de una arquitectura particular
\ No adecuada para problemas complejos, como los de IA
Lenguaje natural
En principio es la aproximaci ón ideal, pero:
\ es prolijo
\ es ambiguo
\ depende del contexto
La lógica: utilizada tradicionalmente por fil ósofos y matemáticos para representar
y formalizar los razonamientos

Programación Lógica PROLOG

Ejemplo de lógica simbólica

Ejemplo clásico de lógica:


 
   
"!#$%& '()  *$
permite deducir que:
"!#$%& 
Se puede representar mediante l ógica simbólica como:
+-,/.102436587:9<;>=@?$3A2CB(D 9 7E=:FG+IHJ3K2 BLB
+MN.5O7E9 ;>=P?3Q:7R>=P+$FS?EQ:B
F , .9<7:=EFS+HJ3
Q:7R>=P+$FS?EQ:B
TVU + ,>W +MYXZ[F ,
Elementos fundamentales de la l ógica:
\ Sintácticos: conectivas, cuantificadores, constantes, variables, sı́mbolos de
función, sı́mbolos de predicado
\ Axiomáticos: axiomas, reglas de inferencia, demostraci ón
\ Semánticos

Programación Lógica PROLOG


De la Representación a la Computación

La solución anterior es buena para la representaci ón del problema


Si tuviéramos un procedimiento de deducci ón efectivo D
una nueva visión de la resolución de problemas y la computaci ón [Greene]:
\ programar una sola vez el procedimiento de deducci ón
\ encontrar una representaci ón adecuada del problema
\ para obtener soluciones: formular preguntas y dejar que el procedimiento de
deducción haga el resto
Representation
Problem

Questions Deduction
system

Answers / Results

Algoritmo = lógica + control [Kowalski, 1979]

Programación Lógica PROLOG

Breve historia de la programación lógica

Década de 1960
\ Greene: problem solving.
\ Robinson: resolución lineal.
Década de 1970
\ Kowalski: interpretación procedural de cláusulas de Horn:
\ Colmerauer: Prolog (Programmation et Logique).
\ D.H.D. Warren: Prolog compiler (hecho en Prolog). Muy eficiente (WAM)
Décadas 1980 y 1990
\ Investigación en paradigmas y técnicas de implementación avanzadas: Japón
(Quinta Generación), US (MCC), Europa (ECRC, proyectos ESPRIT).
\ Implementaciones comerciales
\ Sistemas de programación lógica paralelos y concurrentes.
\ CLP: Programación lógica de restricciones
\  ISO Prolog standard.

Programación Lógica PROLOG


Desarrollos actuales

Muchos sistemas CLP comerciales


Extensiones: orden superior, inclusi ón de paradigma de programaci ón funcional,
etcétera
Compiladores optimizantes, paralelismo autom ático.
Sistemas distribuidos.
Dialectos orientados a objetos.

Programación Lógica PROLOG

11

Caracterı́sticas de la Programación Lógica

Elementos clave
\ Unificación de términos
\ Mecanismo de inferencia autom ática
\ Recursión como estructura de control b ásica
\ Visión lógica de la computación
Aplicaciones fundamentales
\ Bases de datos
\ Representación del conocimiento
\ Lenguaje natural
\ Metaprogramación
\ En general, búsqueda en un espacio de soluciones

Programación Lógica PROLOG


Ejemplo introductorio (I)

Relaciones familiares 5C6


#: %&+]"#$! 2CI1JK3 81L
#:  %&+]"#' ! O PP
#: A#$ H',* OO O PP
#:A#"'WI'& O P
5C6 546
2C
DFE:= 3 @HG 24 ?813 @A;B8
&1*$:"$#%'&( ( #:)#%+*,
#:
 -*'&(

&1*$:").'/( ( #:-.)0!, 5C6 546


#:
 10'/( 2C
?;>M13 JKE+N 24
7"8:3 9<;>=

\RQP`.bYP\,S;[bT T
Cómo se puede representar ?

Programación Lógica PROLOG

13

Ejemplo introductorio (II)

Cálculo del factorial de un número:


^\X"O3f;g.ZF\Y _V
^\X"O3f;g.ZF\
Y
 _R 



 Z;c

^\X"O3f;g.ZF\Y
  
Z;c 
V

Programación Lógica PROLOG


Términos

Constantes:
\ Cadenas de caracteres que empiezan con minúscula, pueden incluir S y
dı́gitos. También pueden ir entre comillas:
e"`M\IH  aE\;g.ZF\  N.fYP\  h=\FO3f,SHhg\4H3[bKJ"L3fa"Q3gb \8YO3fMJ,ON'P QJ>R3Yh=fY,TSUJ
\ Números: VVV , XWW , Y V<TS ,  <V TSPb Y , ]V<TS[Z Y
Variables: Cadenas de caracteres que empiezan con mayúscula (o ), pueden
S
S
incluir y dı́gitos: \
^] `_a+aH` cbXHSPe\Hg8[MZ
H%SHhg\4H3[b S  S[d
Estructuras: un nombre de estructura (como una constante) seguido de un
número determinado de t érminos entre paréntesis:
  VXVg  ^bXNM\ Y`H.bcfe=b=c

El número de argumentos de una estructura es su 4hii .

Programación Lógica PROLOG

15

Hechos y reglas

Un  es una expresión de la forma:  3 F ,W



W F :B
donde  es el nombre de un predicado y F ,W

1W F son términos.
 Los hechos dicen cosas que son ciertas.

Las son de la forma:


, ,
  3 F%, W
 W F  B .)(  ,>3 F , W

W F , B W
  W +* 3AF *, W
W F * * B 
 "!$#&%'  ,-#. /-0
Donde los 1 son nombres de predicado y los F son términos.
*
 “  ( ” representa la implicación lógica, y las comas la conjunción:
2436587:9<;>=>=>= ;&7@? 3<A 9 9 DE2 FG587 F9 ;>=>=>= ;&7 F?'F A
es cierto B6C 29 587 9 ;>=>=>=';&7 ?69 AD ... son ciertos
Ejemplos:
Hechos 1"*$:)#%+& Reglas
 ( # :)#%:*,
"#:" %&"&+ "#$!
#:-*+&
$*$
# A+ ,#$ 
+;'5*:$&"&'$-. ( +;'5*")."
+;'2"*:$&&"'$"A1 ##)
*#"
 ).

Programación Lógica PROLOG


Cláusulas, predicados, programas y consultas

Reglas y hechos se denominan T   @ .


Todas las cláusulas cuya cabeza tienen el mismo sı́mbolo de predicado y aridad
forman un )ih&[i .
Las cláusulas en un mismo predicado proporcionan diferentes alternativas:
22 9 ;>=>=>="; 2 ?
2 9 ;>=>=>= ; F
=>=>=
se puede leer como: “para probar 2 , hay que probar 2 9 ;>=>=>='; 2 ? , o probar  9 ;>=>=>= ; F , o ...”

Ejemplo:
+;'2"*:$&&'$"A1"##)
+;'2"*:$&&'"$ -. ( +;'5*,)." * #-.
+;'2"*:$&&'"$ -. ( +;'5,
* )." " :&1# 1% -.8

Un        h&[ es un conjunto de definiciones de predicado.



Una [
   es una pregunta que se realiza sobre un programa l ógico.
&+H'2"*:$&'$,0 *!)R 1"*$: %&++.
Ejemplos:

Programación Lógica PROLOG

17

Unificación

Unificar dos expresiones (por ejemplo t érminos) es buscar una sustituci ón para
las variables que hace que las expresiones sean id énticas.
 
Una  h Th  es una asignación de términos a variables.
   
Ejemplo:   h T h
  
Q.b;g8gf Q3bPg8gf
\ \

] ] 

\ \

\ \
\ \

^  h2O" ^ a N  h "e" a <N fe O
Q.b;[8gf aM\;gMZF\
\ Imposible (1)
^  h 2O" ^ a N 
 O "e"
\ \ Imposible (1)
^   ^ >]  Y >]"
Imposible (2)

1. Términos con diferente nombre y/o aridad no se pueden unificar. Solamente


se pueden dar valores a las variables.
2. Una variable no se puede ligar a un t érmino que contiene esa variable,
porque esto crearı́a un t érmino infinito  test de ocurrencia (occurs check).

Programación Lógica PROLOG


Rol de la Unificación en la ejecución

Se utiliza la unificación para pasar parámetros en llamadas a definiciones de


predicados.
Se utiliza la unificación para devolver valores al final de la ejecuci ón de un
predicado.
El  Gi de un parámetro depende de la forma en que se unifican los
argumentos al llamar a un predicado. \
\!Q8`.bY;f"S;[b &e`M\4H  _V
Ejemplo: Considérese \
\RQ8`.bYPf"S;[8b 2[\@ Z[ V
frente a
También nos permite acceder a datos:
YZa ZOb aE\OgMZ;X`EYP\ 2^b=XN.\   bH.b;gf T,"("_V
Dado el programa: Y
[MZ\ ^bXNM\  ZF\ S  S   ZF\ V

Y=Za ZO=b aE\FOgMZ;X`MYP\   [MZF\ 


 Z\  V
La consulta:
 ZF\
proporciona en la variable el dı́a lı́mite para la entrega de matrı́cula.

Programación Lógica PROLOG

19

Ejemplos de consultas

Dado el programa...
"#:" %&+]#$ 
"#:"   %&+]#"' 
"#:"  "#$ ];'!,"* 
"#:"  "#'    IF'
1"*$:  )#%+&  ( #:$# :*"]#:-*'&(
1"*$:  -.+/  ( #:
 ).%$0 "]#:10'/(

... PROLOG puede responder a consultas como:


 

    )  
QM\;[Pgb; S [8b &e`.\IH  Q.b;[8gf _V b=c
QM\;[Pgb; S [8b &e`.\IH  [\@Z"[_V MH f
\ \

\R8 Q `3bYPf"HS [b  a ZhH`3bY V e`M\IH

\ \

\R8 Q `3bYPf"HS [b f] V
\ e`M\IH  ]

a  Z hF`.bY f
e`M\IH  ] [ \ EZ"[
\ \ \
\R8 Q `3bYPf"HS [b &e"`M\IH   V a ZhH`3bY f [
\ @Z"[ 

Programación Lógica PROLOG


Arbol de búsqueda

C 8 #: %&+]#$!

C . #:   %&+]#' !
C M #:  A#$ H',*
 C @ #:  A#"' WI'&
! C . &1*$:"  $#%'&(  ( #:)#%+*, " #:")*%+&(
" C . &1*$:"  ).'/(  ( #:
 -.)0!, " #:" 0 +/(

\
\RQP`.bYPf,S;[b e`M\IH   V$# (De quién es Juan abuelo?)
abuelo_de(juan,X)
C5,{L=juan, M=X} C6, {X’=juan, Y=X}

padre_de(juan,K),padre_de(K,X) padre_de(juan,Z),madre_de(Z,X)

C1, {K=pedro} C2, {K=maria} C1, {Z=pedro} C2, {Z=maria}

padre_de(pedro,X) padre_de(maria,X) madre_de(pedro,X) madre_de(maria,X)


C3, {X=miguel} C4, {X=david}

EXITO EXITO
X = miguel X = david

Programación Lógica PROLOG

21

Un intérprete esquemático de PROLOG (I)

 
 

Un programa lógico y una consulta
.
   
Todas las respuestas (soluciones) posibles a la consulta.
\ Una respuesta es del tipo
 , donde  es una sustituci ón que hace que

sea cierto (es decir
 es una consecuencia l ógica del programa).
FALLO, si no es posible inferir ninguna respuesta (soluci ón).
 
 
  
 
    
  
 : Lista de objetivos a demostrar.
 : sustitución a aplicar a la consulta.

Programación Lógica PROLOG


Un intérprete esquemático de PROLOG (II)

1. Inicializar la lista  de objetivos a demostrar con la consulta


.
2. Mientras  no esté vacı́o, hacer:
2.1. Tomar un literal  de 
2.2. Tomar una cláusula (renombrando sus variables)  ."( , W

W  del
programa (hecho o regla, !#" ):
\ tal que  y $ unifican con el unificador  .
\ Si no hay tal cláusula, terminar con FALLO.
2.3. Eliminar  de  y añadir  , W

W  (al principio de)  .
2.4. Aplicar  a  y a
.
3. Si  (lista de objetivos) es vacı́a devolver
y terminar (la consulta ha tenido
EXITO), en otro caso terminar con FALLO.
Los pasos 2.1 y 2.2 no est án completamente determinados. En PROLOG son,
respectivamente, el primer literal y la primera cl áusula. En otros sistemas puede
ser distinto.
Cuando en una rama hay un FALLO, el sistema hace backtracking e intenta otra
cláusula en 2.2

Programación Lógica PROLOG

23

El primer programa Prolog


#"$(&#$*$ ,
0. Crear un nuevo directorio
1. Entrar en el sistema: Menú Inicio  Programas  Emacs
 !#"$(#$*$&,
2. Entrar en el directorio :
C(D   
#"$(#$*$,

 '5+#$ 
$*.>F*
3. Crear el fichero
C(D C( 7"$*.>F*

 '2+#$ 

4. Introducir el programa:
"$* ( "'!* ) 
$* &+$
" +*3 '5+#$ 

5. Salvar el programa:
C(D C( '2+#$ 

6. Cargar el programa en el intérprete de Prolog:


C( *

7. Cambiar de buffer :
C(D $

8. Realizar una consulta:


"$*. '2+#$ 

Programación Lógica PROLOG


Programación Recursiva

A partir del ejemplo de relaciones familiares:


"#:" %&+]#$  "#:" %+]#' 
"#:"
 "#$ ];'!,"*  "#:"
 "#"' IF'

Se puede definir la relaci ón


I\ HObQM\cH\;[f8T T como:
#$ ,&+H'$# ).'/  ( #:-.'/(
#$ ,&+H'$# ).'/  ( #:  -.'/(

+&$").'/  (   #$,&+H'$#-.'/
+&"
$ ).'/  (  #$,&+H'$#-.)0 ,
&+
$ 10'/

Dado este programa, PROLOG puede responder a consultas del tipo:


Consulta Respuesta
\IHObQM\cH\;[f e`M\IH c] V
\ Y = pedro; Y = maria; Y = miguel; Y = david
\IHObQM\cH\;[f  a ZhF`.bY_V X = pedro; X = juan
\IHObQM\cH\;[f aE;\ gMZ\  e`M\4H  V
no
\ \ \
Q.\;gMZbIHO=b "] , Q=gMZaEf " ] , a Z;caE\"SHhbH.bPg\XZFf4H  ]
Ejercicio: Definir

Programación Lógica PROLOG

25

Datos Estructurados

Las estructuras de datos se crean usando t érminos compuestos.


El nombre de un término compuesto se llama functor
Ejemplos de términos compuestos:
^b=XN.\  Z\ "e=bc>R[H ZFf 
\;gQMf8Y>Z.YHb"aMbHO3f  _ =  bPg
\;gQMf8Y \ \;gQMf8Y Q 3 f3Z"[ 3
 f3Z[&\HgQMfY X =f=Z"[  =f3Z[,
Ejemplos de programaci ón con estructuras de datos:
#'   # 1$*"'  : 0 : , '!
$%:'
H'#" # 1$*,$%I$'%7I$'R" $%!8
$%:'
H'#"  # 1$*, :  K
 : ,$%  (
$%:'
H'#"5K
 $% 
$%:'
H'#"  # 1$, *  : AI$'&  ! , $%  (
$%:'
H'#"  2  $% 
\ \ \
g\3Z \  NMf;e\"S3ZF`6Z"bPg8[\  Q V ?
Ejercicio: ¿Qué devuelve en la consulta

Programación Lógica PROLOG


Programación Recursiva: Listas (I)

Las listas son un caso particular de t érminos compuestos.


Estructura binaria: el primer argumento es un elemento y el segundo argumento
es el resto de la lista.
Para representar esto necesitamos:
\ Un sı́mbolo de constante: la lista vacia denotada [ ]
\ Una estructura de aridad 2: tradicionalmente el nombre de la estructura es el
punto “.”
El punto no se usa normalmente: el t érmino .(X,Y) se representa por [X Y]
(X es la cabeza, Y es la cola)
objeto formal sintax. cons sintax. elemento
.(a,[ ]) [a [ ]] [a]
.(a,.(b,[ ])) [a [b [ ]]] [a,b]
.(a,.(b,.(c,[ ]))) [a [b [c [ ]]]] [a,b,c]
.(a,X) [a X] [a X]
.(a,.(b,X)) [a [b X]] [a,b X]

Programación Lógica PROLOG

27

Programación Recursiva: Listas (II)

Ejercicio:
\ Dado el programa:
\ \
ZhH`M\8Y;b=c  _ V
\ Obtener el resultado\ de las siguientes consultas:
ZhH`M\8Y;b=c N5\  Q+P 5N \ P
\
ZhH`M\8Y;b=c N5\TP +5N \ P%
\
ZhH`M\8Y;b=c N5\TP +5N \   Q P
\
ZhH`M\8Y;b=c N'P N P
\ \
Predicado \
equivalente a
ZhH`M\8Y;b=c "
 
]  :
] (unificaci ón). Ejemplos:
5N \  QP 5N \ P
\
5N \[P 5N \ P
\

\ \ \
N & \TP N:]  P

Programación Lógica PROLOG


Programación Recursiva: Listas (III)

\ de\ un
Pertenencia \ elemento a una lista:
aMb"aQ3bPg
\ N  c P _V \
aMb"
a Q3bP
N:] ]Mc P  R<
g aMbaQ.bPg "].c  V
\
aMb"a3Q bPg " ] :
Usos de
( 1"#  1 7 10 R
Ver si un elemento está en una lista: 
)
( "  &1"# ).%W1  
Buscar un elemento en una lista:
.  
 
. 1
 

. 
 
 
+"$
( "&1"#  
  /(
Buscar una lista que contiene un elemento:
/  



/  0:   

/  0 : %0:  
)
\ \ \
Q=gbP^MZd
 
] 
  c`3^8^MZd
 
] 
  c`,E Q Y=Z;cO  ]
Ejercicio: Definir

Programación Lógica PROLOG

29

Programación Recursiva: Listas (IV)

Concatenación de listas:
\"QPQ.bH3[
N'\P c
 \ ]Mc ]Mc  V \ \
\"QPQ.
b H3[
N  c P c]McON =cP R  \"Q8Q.bIH3[ cf]Mc =c V
\
\"Q8Q.bI3 H [ "]  
Usos de :
( &+   1
  % 0!
Concatenar dos listas:
0  


A 1 
 
+$
( &+-.   1   
Encontrar diferencias entre listas:
.  


A 1

 
+$
\
\Q8Q.bH=[  ] N5\  QP
Ejercicio: Cuál es el resultado de
\
Ejercicio: Definir
 bPg=cHb
g8b = "]

Programación Lógica PROLOG


Aritmética (I)

Enfoque práctico: interfaz con las capacidades aritm éticas de la máquina.


Las operaciones aritm éticas no son muy generales ni declarativas.
Interfaz: evaluador de t érminos aritméticos.


Ejemplos
\ de términos aritméticos: \
\ -S T]FT , correcta si cuando se evalúa , ] y resultan ser t érminos


aritm\ éticos, en otro caso, se produce un error.
\ \ )S , incorrecta (error).
Predicados aritm éticos

predefinidos:
 
 ,
\ Los usuales (distinto), , ,
R
(igual),
Los argumentos de los predicados anteriores deben ser t érminos aritméticos
(en otro \ caso se produce un error). \
\ Z;c
: se evalúa el término aritmético y el resultado se unifica con el
término . Ejemplos: qu é diferencia hay entre las \ siguientes consultas?: \
[MZ;cQMYP\  Sa_V Z;c S a  [.Z;cQEY;\   V

Programación Lógica PROLOG

31

Aritmética (II)
\
Ejemplos: Supongamos que e
] est án ligados a S y a respectivamente, y es
una variable libre (sin ligar):
Z;c T  a
No fallan:
ZHcKW   
T  a R W 
]
\    \
\
ZHc ]   R
Fallan:
]
T  a ZHc W 
] \  \ 
\ ZHc 
Producen error:

R ^ \ 
\ de programa aritm
Ejemplo
c`;aE\
\ ético:
"]   R  Z;c K]WV
\
Q fIH.\X8XZK

^.Z M 
Y;bIH=hPO;N

Ejercicio: Definir ,

 :
es la longitud de la lista ; HMf;[8b=c
6R 
 :
es el número de nodos
del árbol .
R

Programación Lógica PROLOG


Operador de Poda: Corte (Cut)

Mecanismo para controlar la ejecuci ón.


Evita el backtracking en el punto en el que se introduce.
Un corte obliga a Prolog a quedarse con todas las elecciones hechas desde que
una consulta (padre) se unific ó por primera vez con la cabeza de la cl áusula en la
que se encuentra el corte, e ignorar las dem ás.
Por tanto, se podan:
\ Todas las cláusulas que se encuentran a continuaci ón.
\ Todas las soluciones alternativas de la conjunci ón de consultas que hay antes
del corte en el cuerpo de la cl áusula.
pero no afecta la búsqueda en las consultas que est án después del corte.

Programación Lógica PROLOG

33

Operador de Poda: Ejemplo


    ).%+/( *"-.
 (
1  ).%+/( #-., 
#    ).%+/( -.
# ( 1  "* ).( 
s(A),p(B,C)
A/a A/b
p(B,C) p(B,C)

l(B) r(B),!,.... m(B) l(B) r(B),!,.... m(B)


B/a B/b B/a B/b

!,..... !,.... !,... !,....

Programación Lógica PROLOG


Operador de Poda: Tipos de corte (I)

Cortes Blancos: no descartan soluciones:


\ \ \
aE\[d "

]   R<
\ \   ] PV
aE[
\ d "] "] R< ] V
W

No afectan ni a la completitud ni correcci ón: se pueden usar libremente.


Cortes Verdes: descartan soluciones correctas que no se necesitan:
\ \
[MZ"g8b=X8XZfIH
\   Z"g% R  [MZgb=X8XZFfIHSX;\c;\ @\ Z"gPV
[MZ"g8b=X8XZfIH   Z"g% R  [MZgb=X8XZFfIHSOg\RQ.\Pef   Zg V
\ \ \
aMb"a"Q.bPg3XN.b=X 
 N  cP R ;V
\ \ \ \
aMb""
a Q.bPg3XN.b=
X   N ]  cP R  a.b"aQ.b;g3XN.bX  c _
 V
\ Afectan completitud pero no correcci ón.
\ Necesarios en muchas situaciones.
\ Usar con precaución.

Programación Lógica PROLOG

35

Operador de Poda: Tipos de corte (II)

Cortes Rojos: descartan soluciones incorrectas de acuerdo con el significado


intencional de programa.
\ \ \
aE\ d \  ]  _ R   ] ;V
a \
E d  ] "]_ V
\ \
[\.c S3Z HS b8\;g
\  S g g  R  Y;b8\"QS b\;g ;V
\ .
c S3Z H S b8\;g  S
[
gY  V
Los cortes rojos afectan la completitud, y no se puede confiar en la interpretaci ón
declarativa del programa para razonar sobre su correcci ón: evitarlos siempre que
sea posible.
\
QM\HgMZbHO=b=c
" ] para que solamente d é un resultado.
Ejercicio: Modificar
\ \
\HgQMfY SXN.bX "] ]
Ejercicio: Definir , que compruebe si est á en el árbol , de
forma que proporcione un solo resultado.

Programación Lógica PROLOG


Predicados meta-lógicos (I)

Están\ fuera del ámbito\ de la lógica de primer orden.


 \Hg 
3
#, 3\\; g : \tiene

\ éxito
si es una variable libre.
^ \ _V
\
O@ZbH3b bT dEZO3f
#, ^ \ 3  \Hg _V
^\Y8Y;\
\ \
HMf4H 3 \;g 
#, \ ^>]:tiene éxito si\ no es una variable libre.
cHMf4H 3\;g  V
O@Z"bH.b b[ dEZO3f
\ \
hgf"`H3[ 
#, \ ^>]:tiene éxito si\ no incluye variables.
 hgf"`H3[  V
^\8Y8YP\
\ \
X;f4@
H \
c"O3\4HO 
éxito si\ es una constante (número o átomo).
#, ^>]: tiene X;f4H@c"O3\4HO  V
^\Y8YP\

Usos:
\ controlar el orden de los objetivos,
\ dar flexibilidad a programas que utilizan algunos predicados determinados
(por ejemplo, los predicados aritm éticos)

Programación Lógica PROLOG

37

Predicados meta-lógicos (II)

Ejemplo:
*&+,%)."R(
I# )." , '2+,# R" *+,":&+%+. 
*&+,% )." R(
+$&+I # -. , *+,:*'&).""8

*&+,":&+ - R


*&+,":&+ %: ." R(
   
-  ' (  *+,:+

(:." 
*&+,":*'& % - 
*&+,":*'& H. ." (

*&+,:*' -." ,

'   P
\
YZ;c"O3\,SHhgf`H3[  : X es una lista de t érminos ground (sin
Ejercicio: Definir
variables). \
\HgQMfY SY=Zh\;[f  
Ejercicio: Definir , que liga todas las variables libres de nodos
o subárboles del árbol X al término T (dejando un árbol bien formado).

Programación Lógica PROLOG


Meta-predicados: Orden superior (I)
\ \
X;\8Y8Y  convierte un término en una consulta (objetivo), y lo ejecuta.
Se usan para meta-programaci ón: intérpretes y shells.
Permite programación de orden superior
Ejemplo: Negación por fallo
HMfFO fIH@c`EYO3\ R  XH\Y8YfIH@c`EYO3\  ^\3ZHY V
HMfFO fI@H c`EYO3\ V
\ Es útil pero peligrosa:
\ \ \
`PH aE\Hg8gMZb;[ S c"OH`3[bHO _R  HMfFO aE\;g8g.ZbP[ " cO;`3[bIHO  V
c"O;`3[8b
H O efPb%_ V
aE\;g8g.ZbP[ef"NH V

^MZ
H=[\Y8Y;TXS
Existen otros predicados de orden superior ( ,...)

Programación Lógica PROLOG

39

Meta-predicados: Orden superior (II)


\
X;\8Y8Y 
se suele utilizar conjuntamente con los predicados de manipulaci ón de
estructuras:
\ ^F`H@XO3f;g  
"R 
y cuya aridad
: es un término compuesto cuyo nombre es
es .
R
\ _  "R : El argumento de la posición _ del término  es R .
\;gPh
aM\"Q gbP[  MZ;c"O  =b=c
gb;[
Ejercicio: Definir
a cada uno de los elementos de (en el primer argumento de

.Z;c"O
que aplique el predicado
), y
de aridad 2
g8bP[
gb;[ =bc
devuelva los resultados (el segundo argumento de ) en la lista .
Ejemplo: la consulta: \
aM\"Q ^\X"O3f;g.ZF\Y
S  S   N<a  Y  g P 
\
debe devolver en la lista
N TTa !T"  W"T"TP .
aM\"Q gbP[  bPga  =b=c gb;[
Ejercicio: Definir que aplique el predicado de aridad 2
b;ga
a cada uno de los subtérminos de (en el primer argumento), y devuelva los
=b=c
resultados (el tercer argumento) en el t érmino .

Programación Lógica PROLOG


Modificación Dinámica de Programas (I)
\cPcHbPg;O=T gbHOg\X"O3T% \RQMf8Y=Z;cN.T=VPV8V

Caracterı́stica potente: permite realizar la modificaci ón de los programas en


tiempo de ejecución.
A veces es útil, pero en la mayorı́a de los casos es un error usarlos:
\ Programas difı́ciles de leer, entender, y depurar.
\ Los programas dinámicos suelen ser más lentos.
Debe utilizarse de manera cuidadosa y local.
La aserción y eliminación se pueden justificar l ógicamente:
\ Aserción de cláusulas que son consecuencia l ógica del programa (lemas).
\ Eliminación de cláusulas que son lógicamente redundantes.
Otro uso permitido: simular variables globales.
Comportamientos/requisitos para asertar/eliminar predicados difieren entre las
implementaciones Prolog.

Programación Lógica PROLOG

41

Modificación Dinámica de Programas (II)

Ejemplo: Un contador
R  [ [
 HM\a6Z;X X;f4HO3T V
\
X;fIHO=\;[f;g  R< \
gbHOg\X"O X;fIHO  ,
\
Z;c
\
   \
\c8cHb;g; O XHIf H O "PV
X;I
f HO=\;[f;g   <R 
\c8cHb;g; O XHIf H O  " V

Programación Lógica PROLOG


42

Modificación Dinámica de Programas (III)

Y;b8bPgS;[MZ;XK 
Ejercicio: Definir un predicado que lea de un archivo F un
[MZ;XO 3\8YP\RQ3g\ .Zh[H6Z"^.Z;X;\;[f 
diccionario, formado por hechos de la forma: . Para
leer de un archivo, debe utilizarse la siguiente estructura:
Y;bPbPg S;[.Z;X K  R 
f"Q3bH K !gb\H[ HOgb\a 
Y;bPbPg S;[\FO3fcHOg8b\a 
[8bQ.b Q=gfHhg\aE\;g=cHb b=cO=b Q=gbP[MZHX;\;[f
XPY;fcHb HOgb8\a V

g8b\;[ 
Para leer un término de un stream, debe utilizarse .
Ejercicio: Definir un predicado
Q8`@c8XH\;g %
que busque la palabra P en el

diccionario leido con el predicado anterior, y proporcione en S el significado.


Ejercicio: Definir un predicado
Q8`@c8XH\;g SFO=f;[fc  % que devuelva en L todos los
significados de la palabra P.

Programación Lógica PROLOG

También podría gustarte