Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacion PLC Siemens 01
Programacion PLC Siemens 01
Programaci
on L
ogica
I
1 Gram
aticas y Lenguajes
1.1 Gramaticas . . . . . . . . . . . . . . . . . . . . .
1.2 Lenguaje generado por una gramatica . . . . . . .
1
3
3
7
2 An
alisis Sint
actico
11
2.1 Tecnicas descendentes . . . . . . . . . . . . . . . 15
2.2 Tecnicas ascendentes . . . . . . . . . . . . . . . . 17
2.3 Eliminacion de ambig
uedades . . . . . . . . . . . 20
II
L
ogica: Conceptos Fundamentales
3 C
alculo de Proposiciones
3.1 Evaluacion de proposiciones: tablas de verdad . .
3.1.1 Evaluacion de proposiciones constantes . .
3.1.2 Evaluacion de proposiciones en estados . .
3.1.3 Evaluacion de proposiciones sin parentesis
3.1.4 Tautologas . . . . . . . . . . . . . . . . .
3.2 Reglas de reescritura . . . . . . . . . . . . . . . .
3.2.1 Leyes de equivalencia . . . . . . . . . . . .
3.2.2 Reglas de sustitucion, resolucion y
transitividad . . . . . . . . . . . . . . . . .
3.2.3 Axiomas y teoremas . . . . . . . . . . . .
i
23
25
27
28
29
30
33
35
36
37
41
ii
Programaci
on L
ogica
4 C
alculo de Predicados
4.1 Extension del concepto de estado . . . . . .
4.2 Los operadores cand y cor . . . . . . . . . .
4.3 Cuantificadores . . . . . . . . . . . . . . . .
4.3.1 El cuantificador universal . . . . . .
4.3.2 El cuantificador existencial . . . . . .
4.3.3 El cuantificador numerico . . . . . .
4.3.4 Equivalencias entre cuantificadores .
4.3.5 Cuantificacion sobre rangos infinitos
4.4 Identificadores libres y ligados . . . . . . . .
4.5 Sustitucion textual . . . . . . . . . . . . . .
4.6 Sustitucion simultanea . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
43
44
46
48
48
49
50
51
53
54
56
59
5 Prolog y C
alculo de Predicados
5.1 Regla de resolucion . . . . . . .
5.2 El proceso de resolucion . . . .
5.2.1 Un ejemplo simple . . .
5.2.2 Un ejemplo completo . .
.
.
.
.
.
.
.
.
.
.
.
.
61
61
63
64
68
III
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
El Int
erprete L
ogico
79
6 Conceptos Fundamentales
81
6.1 Objetos en programacion logica . . . . . . . . . . 81
6.2 Programas logicos, clausulas y preguntas . . . . . 83
6.3 Concepto de unificacion: sustituciones e instancias 85
6.4 Un interprete logico simple . . . . . . . . . . . . . 89
6.5 El concepto de retroceso . . . . . . . . . . . . . . 94
6.6 Significado de un programa logico . . . . . . . . . 100
6.6.1 El orden de tratamiento de los objetivos . 105
6.6.2 El orden de aplicacion de las clausulas . . 107
7 Control en Prolog: el Corte
7.1 Semantica operacional . . . . . . . . . . . . . .
7.2 Tipos de cortes . . . . . . . . . . . . . . . . . .
7.2.1 El corte verde . . . . . . . . . . . . . . .
111
. 111
. 122
. 123
iii
Programaci
on L
ogica
7.3
8 La Negaci
on
127
8.1 El predicado fail . . . . . . . . . . . . . . . . . . 127
8.2 La negacion por fallo . . . . . . . . . . . . . . . . 130
8.3 Anomalas de la negacion por fallo . . . . . . . . 132
9 Control de la Evaluaci
on
139
9.1 La primitiva freeze . . . . . . . . . . . . . . . . 139
9.2 La declaracion wait . . . . . . . . . . . . . . . . . 142
IV
Programaci
on L
ogica
10 Las
10.1
10.2
10.3
145
Listas
Definicion del tipo lista . . . . . . . . .
Operaciones fundamentales sobre listas
Operaciones sobre conjuntos . . . . . .
10.3.1 El tipo conjunto . . . . . . . . .
10.3.2 La union . . . . . . . . . . . . .
10.3.3 La inclusion . . . . . . . . . . .
10.3.4 La interseccion . . . . . . . . .
10.3.5 El producto cartesiano . . . . .
11 T
ecnicas de Programaci
on
11.1 Los acumuladores . . . . . . . . .
11.2 Estructuras de datos incompletas
11.2.1 Diferencias de listas . . . .
11.2.2 Diferencias de estructuras
12 Predicados No L
ogicos
12.1 Predicados aritmeticos . . .
12.2 Entradas y salidas . . . . .
12.3 Predicados de memorizacion
12.4 Predicados metalogicos . . .
12.5 Comentarios . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
147
. 149
. 149
. 160
. 160
. 161
. 162
. 162
. 164
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
183
. 183
. 185
. 186
. 193
. 195
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
165
165
171
172
178
iv
Programaci
on L
ogica
13 Los Operadores
13.1 Definicion de operadores . . . .
13.1.1 Operadores binarios . . .
13.1.2 Operadores unarios . . .
13.2 Operadores y potencia expresiva
14 L
ogica y An
alisis Sint
actico
14.1 Un acercamiento intuitivo . .
14.1.1 Una tecnica simple . .
14.1.2 Una tecnica flexible . .
14.2 El problema de la recursividad
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
197
198
199
200
202
207
. . . . . . . . . . . 208
. . . . . . . . . . . 209
. . . . . . . . . . . 211
por la izquierda . 212
15 An
alisis del Lenguaje Natural
15.1 Analisis sintactico . . . . . . . . .
15.1.1 Una tecnica simple . . . .
15.1.2 Una tecnica flexible . . . .
15.2 Analisis semantico . . . . . . . .
15.2.1 Concordancias de genero y
15.2.2 El significado de las frases
. . . . .
. . . . .
. . . . .
. . . . .
n
umero
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
223
224
225
227
229
231
236
Lista de Figuras
2.1
Arboles
de derivaci
on para las expresiones
ambiguas con la cadena de entrada 2 + 3 4 . .
Un ejemplo de an
alisis descendente . . . . . . .
Una rama de profundidad infinita . . . . . . . .
Un ejemplo de an
alisis ascendente . . . . . . .
Arboles
de derivaci
on para las expresiones
ambiguas con la cadena de entrada 2 + 3 + 4 .
aritmeticas
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
aritmeticas
. . . . . . .
21
5.1 Resoluci
on de :- mortal(Individuo). . . . . . . . . . . .
5.2 Resoluci
on de :- invertir([1,2], Invertir). . . . . . .
67
77
2.2
2.3
2.4
2.5
14
16
17
18
6.1 Representaci
on arborescente del termino fecha(A
no, Mes,
Da). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
6.2 Arbol
de
resoluci
on
para
la
pregunta
:numero natural(siguiente(siguiente(0))). . . . . . . . 93
6.3 Resoluci
on de :- numero natural(X). . . . . . . . . . . . 96
6.4 Resoluci
on de :- suma(0,siguiente(siguiente(0)),X).
99
6.5 Resoluci
on de :- suma(X,Y,siguiente(siguiente(0))). 102
6.6 Resoluci
on de :- suma(X,Y,Z). . . . . . . . . . . . . . . . 103
7.1
7.2
7.3
7.4
7.5
Arboles
con corte para :- numero de padres(Adan,X).
y :- numero de padres(Adan,2). . . . . . . . . . . . . .
7.6 Resoluci
on de :- if then else(fail,fail,true)., con y
sin variables an
onimas . . . . . . . . . . . . . . . . . . . . .
112
116
116
120
121
125
8.1 Resoluci
on de :- inferior(0,0)., sin corte . . . . . . . . 129
8.2 Resoluci
on de :- inferior(0,0)., con corte . . . . . . . . 129
v
vi
Lista de Figuras
8.3
8.4
8.5
8.6
8.7
Resoluci
on
Resoluci
on
Resoluci
on
Resoluci
on
Resoluci
on
de
de
de
de
de
:::::-
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
131
132
134
135
136
10.1 Representaci
on interna de la lista [a,[b],c,d] . . . . . . . 148
10.2 Resoluci
on de :- miembro(X,[1,2,3])., con corte . . . . . 152
10.3 Resoluci
on de :- miembro(X,Y)., sin corte . . . . . . . . . 153
11.1 Representaci
on gr
afica de la relaci
on entre listas tradicionales
y diferencias de listas. . . . . . . . . . . . . . . . . . . . . .
11.2 Resoluci
on de :- aplanar([a,[b]],Resultado)., con
diferencias de listas. . . . . . . . . . . . . . . . . . . . . . .
11.3 Arboles
para las expresiones (a+b)+(c+d) y ((a+b)+c)+d. .
11.4 Arbol
sint
actico asociativo por la derecha para a+b+c+d. . .
11.5 Representaci
on gr
afica de la relaci
on entre sumas
tradicionales y diferencias de sumas. . . . . . . . . . . . . .
173
176
179
180
181
Lista de Tablas
3.1
3.2
3.3
3.4
Tabla de operadores l
ogicos . . . . . . . . . . . . . . . .
Tablas de verdad para los operadores l
ogicos definidos .
Tabla de verdad para la expresi
on (((p) q) T ) . . .
Tabla de verdad para la proposici
on (p q) = (p q)
.
.
.
.
.
.
.
.
26
28
31
34
44
46
6.1 Notaci
on para la representaci
on de los n
umeros naturales. .
84
vii
Parte I
Lenguajes Formales:
Conceptos Fundamentales
Captulo 1
Gram
aticas y Lenguajes
El objetivo fundamental de este captulo es el de introducir
los conceptos basicos en el tratamiento e implementacion de
los lenguajes formales de programacion, y ello por una razon
fundamental que no es otra que la estrecha relacion existente
entre el desarrollo de interpretes o compiladores logicos por
un lado, y la implementacion de analizadores sintacticos por
otro [7, 10, 16, 20, 21, 27]. A este respecto, el conocimiento
de las tecnicas clasicas de analisis sintactico es fundamental
para la comprension efectiva de los problemas planteados en
programacion logica, as como de las soluciones aportadas para
subsanarlos.
1.1
Gram
aticas
Gram
aticas y Lenguajes
S S
S + S
(S)
n
umero
1.1. Gram
aticas
1 2 . . . n , que notaremos .
Gram
aticas y Lenguajes
+
. En caso de conocer el n
umero exacto de
k
derivaciones directas, tambien se usara la notacion
, donde k representa el n
umero de dichas derivaciones.
Ejemplo 1.1.2 Partiendo de la gram
atica de las expresiones
5
aritmeticas indicada en el ejemplo 1.1.1 tenemos que S
2 3 + 4, puesto que:
S S+S SS+S 2S+S 23+S 23+4
2
En la misma lnea, dado un lenguaje L(G) definimos forma
sentencial recursivamente como:
El axioma S de G es una forma sentencial.
1.2
L(G) = { , S }
esto es, el conjunto de cadenas terminales que pueden ser
derivadas a partir del axioma. Mas formalmente, el lenguaje
generado por una gramatica es el conjunto de sentencias para
dicha gramatica.
En este punto, es conveniente fijar un orden de derivacion
con el fin de eliminar diferencias irrelevantes en la generacion de
3 por
Context-Free Grammars.
Gram
aticas y Lenguajes
S+S
SS
S+SS
S4
S+S4
S+S4
S+34
S+34
2+34
2+34
ET
T F
F n
umero
10
Gram
aticas y Lenguajes
A
es evidente que sera imposible generar sentencias del
lenguaje a partir de dichas formas sentenciales. En este
caso decimos que A es un smbolo inutil.
En todo caso es facilmente demostrable que es posible eliminar
tanto smbolos inaccesibles como in
utiles de una gramatica,
sin por ello afectar en absoluto a la integridad del lenguaje
generado [1]. A una gramatica que no contiene ni smbolos
inutiles, ni inaccesibles, ni reglas, ni reglas de transmision
simple, se le denomina gram
atica reducida.
Captulo 2
An
alisis Sint
actico
Una vez construida la gramatica de un lenguaje, es necesario
poner en marcha un mecanismo de reconocimiento tanto de
las categorias lexicas como de las sintacticas, previo a la
implementacion del mismo en un soporte fsico1 . Al primero
se le suele llamar analizador lexico y de alg
un modo constituye
el diccionario de nuestro lenguaje. El segundo es el encargado
de reconocer en la estructura de nuestro texto, las reglas de la
gramatica y se le denomina analizador sint
actico. Por debajo
de este u
ltimo, suele considerarse la nocion de reconocedor
sint
actico entendido como herramienta que verifica la adecuacion
de la estructura de la frase a la gramatica considerada,
mientras que el analizador sintactico construye ademas una
representacion del proceso de analisis. Para facilitar la labor
tanto de reconocimiento como de analisis sintactico, se suelen
considerar gram
aticas aumentadas. Formalmente, dada una
gramatica G = (N, , P, S), decimos que Ga = (Na , a , Pa , Sa )
es su correspondiente gram
atica aumentada si verifica las
condiciones siguientes:
Na = N a = P a = P S a =
donde 6 N . Ello quiere decir que en una gramatica
aumentada es facilmente reconocible el final de un proceso de
1 esto
es, en un ordenador.
11
12
An
alisis Sint
actico
denominados predictivos.
tambien algoritmos de an
alisis sint
actico que aplican tecnicas mixtas.
13
14
An
alisis Sint
actico
S
S
2
+
S
3
S
S
S
4
15
2.1
T
ecnicas descendentes
16
An
alisis Sint
actico
punto, la elecci
on no adecuada de la misma puede conducirnos
a una situaci
on sin salida para nuestro analizador sint
actico.
M
as exactamente, supongamos que sistem
aticamente intentamos
aplicar las derivaciones posibles de una variable siguiendo el
orden indicado por las reglas de la gram
atica en cuesti
on. En ese
caso, para derivar E aplicaramos siempre la regla E E + T
en una exploraci
on en profundidad, pero ello nos llevara a la
construcci
on de a
rboles con ramas de profundidad infinita como
la representada en la figura 2.3. La elecci
on correcta de las
reglas, para el an
alisis descendente de la cadena de entrada que
nos ocupa, es la indicada en la figura 2.2 siguiendo los dibujos
de izquierda a derecha y de arriba hacia abajo. 2
E
El problema planteado en el u
ltimo ejemplo, acerca de la
generacion de ramas de profundidad infinita, es consecuencia
directa de la aplicacion de una construccion en profundidad
del arbol sintactico cuando la gramatica que define el lenguaje
es recursiva por la izquierda. Ello representa una limitacion
fundamental para la aplicabilidad de los algoritmos de analisis
descendente, por cuanto la practica totalidad de los lenguajes
incluyen la misma de forma natural. En contraposicion, este tipo
17
2.2
T
ecnicas ascendentes
18
An
alisis Sint
actico
T
4
+
T
F
3
2
E
F
3
2
3
2
2
E
3
2
F
F
3
2
19
T F
20
An
alisis Sint
actico
del car
acter . En este estadio, tampoco es posible aplicar
nuevas reducciones y continuamos leyendo la cadena de entrada
cuyo smbolo siguiente es 4. A partir de aqu, aplicamos
sucesivamente las siguientes reducciones hasta llegar al final del
an
alisis sint
actico con la reducci
on del axioma E:
T T F
E E+T
2.3
Eliminaci
on de ambig
uedades
21
2.3. Eliminaci
on de ambig
uedades
S
S
+
S
22
An
alisis Sint
actico
Parte II
L
ogica: Conceptos
Fundamentales
23
Captulo 3
C
alculo de Proposiciones
Este captulo constituye una introduccion a los conceptos
fundamentales del calculo de proposiciones. El poder expresivo
de las logicas basadas en la nocion de proposicion es
limitado debido sobre todo a la ausencia del concepto generico
de variable1 , pero su conocimiento es imprescindible para
comprender posteriormente otras logicas mas avanzadas, como
las basadas en el concepto de predicado.
Las logicas basadas en proposiciones surgen como un intento
de formalizar el conocimiento que se posee del mundo, a
traves de un lenguaje formal cuyas sentencias sean facilmentes
manipulables mediante la aplicacion de unas reglas sencillas. Los
elementos individuales de las sentencias son identificadores que
expresan hechos ciertos o falsos acerca del mundo. Por ejemplo,
casa roja es un identificador, cuyo valor puede ser T (verdadero)
o F (falso). Todos los identificadores son de tipo booleano. Este
es precisamente el origen de las limitaciones en su uso.
Inicialmente los identificadores pueden construirse tomando
enunciados del mundo real que representan conceptos atomicos
en el sentido de que no se expresan a partir de una relacion
entre otros conceptos mas simples. De este modo podemos
representar el concepto la casa es roja mediante la expresion
casa roja T .
1 en
l
ogica de proposiciones s
olo existe el concepto de variable boolena.
25
26
C
alculo de Proposiciones
Operador
Nombre
conjuncion
disyuncion
implicacion
equivalencia
negacion
Resultado
T si los dos operandos son T .
T si alguno de los dos operandos
es T .
T si el segundo operando es una
consecuencia del primero.
T si los dos operandos tienen el
mismo valor.
T si el operando es F .
3.1. Evaluaci
on de proposiciones: tablas de verdad
27
proposiciones:
P roposici
on
|
|
|
|
|
|
|
T
F
(Identif icador)
(P roposici
on P roposici
on)
(P roposici
on P roposici
on)
(P roposici
on P roposici
on)
(P roposici
on = P roposici
on)
(P roposici
on)
3.1
Evaluaci
on de proposiciones: tablas de
verdad
28
C
alculo de Proposiciones
p
T
T
F
F
q
T
F
T
F
(p q) (p q) (p q) (p = q)
T
T
T
T
F
T
F
F
F
T
T
F
F
F
T
T
(p)
F
F
T
T
3.1.1
Evaluaci
on de proposiciones constantes
Por proposici
on constante se entiende aquella que no posee
identificadores, es decir, que esta construida mediante la
aplicacion de los operadores directamente sobre los valores T
y F . Ejemplos de proposiciones constantes son: (T ), (T F ),
((F T ) T ).
La evaluacion de este tipo de proposiones es sencilla, ya
que tan solo hay que ir sustituyendo, desde los parentesis
interiores hacia los exteriores, la aplicacion de un operador por
su resultado, que se obtiene directamente de la tabla de verdad.
Ejemplo 3.1.1 Tomemos la proposici
on
(((T (T )) F ) T )
que se transforma en
(((T F ) F ) T )
al sustituir (T ) por su resultado seg
un la tabla de verdad, que
es F . Al sustituir la primera disyunci
on obtenemos
((T F ) T )
Ahora, sustituyendo la conjunci
on, llegamos a
(F T )
para obtener finalmente T .2
3.1. Evaluaci
on de proposiciones: tablas de verdad
3.1.2
29
Evaluaci
on de proposiciones en estados
30
C
alculo de Proposiciones
Evaluaci
on de proposiciones sin par
entesis
3.1. Evaluaci
on de proposiciones: tablas de verdad
p
T
T
F
F
q
T
F
T
F
(p)
F
F
T
T
31
((p) q) (((p) q) T )
T
T
F
F
T
T
T
T
32
C
alculo de Proposiciones
T
F
Identif icador
P roposici
on P roposici
on
P roposici
on P roposici
on
P roposici
on P roposici
on
P roposici
on = P roposici
on
P roposici
on
(P roposici
on)
donde la u
ltima regla permite el cambio explcito de prioridades
mediante el uso de parentesis.
Otra forma de eliminar la obligatoriedad en el uso de
parentesis es la introduccion implcita de asociatividades y
prioridades en la gramatica utilizada para describir el lenguaje
de las proposiciones. Esto es, podemos escribir una nueva
gramatica que contemple las prioridades y asociatividades
por defecto.
Ello hara que esta sea determinista en el
sentido de que solo sea factible un camino para analizar cada
proposicion, justamente la causa que nos obligo en un principio
a incluir sistematicamente el uso de los parentesis. Una posible
alternativa es la que se muestra a continuacion :
P roposici
on
|
Imp exp
|
Exp
|
T ermino
|
F actor
|
|
|
|
Imp exp
P roposici
on = Imp exp
Exp
Imp exp Exp
T ermino
Exp T ermino
F actor
T ermino F actor
F actor
(P roposici
on)
T
F
Identif icador
3.1. Evaluaci
on de proposiciones: tablas de verdad
33
Tautologas
34
C
alculo de Proposiciones
de esta, es f
acilmente verificable la verdad de la proposici
on,
cualquiera que sea el estado en el que sea evaluada, siempre y
cuando nuestra proposici
on este bien definida. 2
p
T
T
F
F
q
T
F
T
F
p
F
F
T
T
p q
T
F
T
T
pq
T
F
T
T
(p q) = (p q)
T
T
T
T
35
3.2
Reglas de reescritura
36
C
alculo de Proposiciones
3.2.1
Leyes de equivalencia
37
8. Ley de la implicacion:
E1 E2 = E1 E2
9. Ley de la igualdad:
(E1 = E2 ) = (E1 E2 ) (E2 E1 )
10. Leyes de la simplificacion del :
E E =E
E T =T
E F =E
E1 (E1 E2 ) = E1
11. Leyes de la simplificacion del :
E E =E
E T =E
E F =F
E1 (E1 E2 ) = E1
12. Ley de la identidad:
E=E
Como hemos comentado con anterioridad, se puede
comprobar facilmente la veracidad de cada una de las
equivalencias en relacion a la logica introducida en la discusion
precedente, construyendo la correspondiente tabla de verdad.
Sin embargo, es importante se
nalar que el conjunto de leyes
enumeradas tambien podra ser considerado como el conjunto
de axiomas a partir del cual definimos nuestra nueva logica y
que en principio no tendra porque coincidir con la definida por
las tablas de verdad. Por otro lado, es necesario ahora completar
este n
ucleo de leyes con un conjunto de reglas capaces de inferir
nuevas tautologas a partir de los conocimientos disponibles, esto
es, de permitirnos avanzar en nuestro conocimiento.
3.2.2
Reglas de sustituci
on, resoluci
on y transitividad
38
C
alculo de Proposiciones
39
40
C
alculo de Proposiciones
(De M organ)
(N egaci
on)
(Conmutatividad)
(M edio excluido)
2
Transformaci
on de implicaciones
Un caso particular muy importante, en relacion con la ley de
la transitividad, es el de la transformacion de implicaciones.
Supongamos que tenemos una proposicion del tipo
E1 E 2 . . . E n E
y que queremos demostrar que se trata de una tautologa.
Evidentemente, la solucion consiste en aplicar las leyes de
equivalencia hasta llegar a la proposicion constante T . Sin
embargo, dicha tarea puede simplificarse notablemente si
aplicamos tales leyes en un cierto orden: primero la ley de la
implicacion y seguidamente la ley de De Morgan. El proceso
sera el siguiente:
E1 E 2 . . . E n E
= (E1 E2 . . . En ) E
= (E1 E2 . . . En ) E (Implicaci
on)
= E1 E2 . . . En E (De M organ)
La proposicion final es cierta si al menos una de las proposiciones
E1 , E2 , . . ., En , E lo es. Estas u
ltimas seran mas simples
41
2
3.2.3
Axiomas y teoremas
42
C
alculo de Proposiciones
Captulo 4
C
alculo de Predicados
Hemos visto en el captulo anterior que la logica definida para las
proposiciones permita expresar conocimiento sobre los hechos
del mundo a la vez que proporcionaba un medio de manipular
dicho conocimiento para inferir nuevos hechos. Sin embargo,
el poder expresivo de las proposiciones esta limitado por su
incapacidad de generalizacion. Se pueden indicar los hechos
de cada elemento individual del mundo, pero no se puede
utilizar una u
nica expresion que abarque a todos los elementos.
Tomando un ejemplo clasico, la logica de proposiciones
permite expresar que Manolo, Miguel y Alberto son hombres
y son mortales mediante las proposiciones hombre Manolo,
hombre Miguel, hombre Alberto, mortal Manolo, mortal Miguel
y mortal Alberto, pero no permite expresar que todos los
hombres son mortales por el hecho de ser hombres. Para
obtener la capacidad de generalizacion debemos abandonar
el mundo de las proposiciones y penetrar en un nivel mas
avanzado de la logica, la l
ogica de predicados de primer orden.
Adicionalmente, el uso de predicados nos permitira utilizar
expresiones booleanas1 en todos aquellos lugares en donde
puedan aparecer identificadores en la logica proposicional.
1 esto
43
44
4.1
C
alculo de Predicados
Extensi
on del concepto de estado
Conjunto de valores
{T , F }
{0,1,2, . . .}
{. . ., -2, -1, 0, 1, 2, . . .}
..
.
4.1. Extensi
on del concepto de estado
45
46
C
alculo de Predicados
4.2
b
T
F
U
T
F
U
T
F
U
a cand b
T
F
U
F
F
F
U
U
U
a cor b
T
T
T
T
F
U
U
U
U
en ingles.
47
48
C
alculo de Predicados
4.3
Cuantificadores
El cuantificador universal
49
4.3. Cuantificadores
n1
i=m
Ei
2
4.3.2
El cuantificador existencial
50
C
alculo de Predicados
n1
i=m
Ei
El cuantificador num
erico
4.3. Cuantificadores
51
52
C
alculo de Predicados
(i : n i < p : Ei )
= (i : m i < p : Ei )
(i : m i < n : Ei ) (i : n i < p : Ei )
= (i : m i < p : Ei )
(N i : m i < n : Ei ) + (N i : n i < p : Ei )
= (N i : m i < p : Ei )
53
4.3. Cuantificadores
4.3.5
Cuantificaci
on sobre rangos infinitos
Predicados
hombre(p)
mortal(x)
54
C
alculo de Predicados
4.4
55
56
C
alculo de Predicados
4.5
Sustituci
on textual
4.5. Sustituci
on textual
57
58
C
alculo de Predicados
y
E(wz)
z
(a+u)
2
Una observacion importante es que al realizar sustituciones
debemos tener en cuenta que la expresion resultante sea
sintacticamente correcta. As, con la expresion E del anterior
b
ejemplo 4.5.4 no se podra hacer Ec+1
puesto que dara lugar a
la aparicion de expresiones del tipo c + 1[i] que son incorrectas.
Un problema adicional que surge al aplicar sustituciones esta
relacionado con los posibles conflictos que puedan surgir con los
identificadores acotados por cuantificadores. Como ilustracion,
supongamos que en el ejemplo anterior deseamos expresar que
x y los elementos del vector b son menores que y i, donde i es
un identificador libre. En principio, expresaramos la situacion
mediante:
y
E(yi)
= x < (y i) (i : 0 i < n : b[i] < (y i))
4.6. Sustituci
on simult
anea
59
4.6
Sustituci
on simult
anea
60
C
alculo de Predicados
(x + x + y)xx+y
y
z
= (x + y + x + y + y)yz = x + z + x + z + z
Captulo 5
Prolog y C
alculo de
Predicados
En este captulo se aborda la relacion existente entre el calculo
de predicados y el lenguaje de programacion Prolog, aplicando
la teora explicada en los captulos anteriores. Mas exactamente,
construiremos un demostrador de teoremas cuyo funcionamiento
se correspondera casi exactamente con el presentado por el
lenguaje citado. A la vez, aprovecharemos dicho proceso
para introducir la terminologa propia de Prolog, as como sus
conceptos basicos.
5.1
Regla de resoluci
on
( i : R : Ei )
Ei
(5.1)
62
Prolog y C
alculo de Predicados
Regla de generalizacion:
E1 , E2 , . . . , En
E1 E 2 . . . E n
(5.2)
a(W ) b(Z)
de donde tendremos que tanto
a(W ) b(Z)
como
a(W ) c(Y )
son tautologas. En este caso, diremos que los terminos a(X) y
a(W ) unifican mediante la sustitucion . Veamos ahora como
podemos aplicar la regla de resolucion. Teniendo en cuenta que
el conjunto de valores posibles para las variables Y , Z y W es
1 el
termino sustituci
on constituye aqu un abuso del lenguaje, puesto que realmente
se trata de un simple renombramiento de variables.
63
5.2
El proceso de resoluci
on
64
Prolog y C
alculo de Predicados
5.2.1
Un ejemplo simple
65
66
Prolog y C
alculo de Predicados
67
6a
68
Prolog y C
alculo de Predicados
5.2.2
Un ejemplo completo
69
70
Prolog y C
alculo de Predicados
71
72
Prolog y C
alculo de Predicados
De forma totalmente an
aloga podramos traducir las cl
ausulas
del predicado concatenar. Se trata pues de demostrar que
(Invertir : invertir([1, 2], Invertir)) = F
lo que es equivalente a probar que
(Invertir : invertir([1, 2], Invertir)) = T
Si consideramos la sustituci
on7
1 { Car 1, Cdr [2], Invertir Invertir1 ,
Invertir Cdr Invertir Cdr1 }
y aplic
andola sobre la segunda cl
ausula, tendremos que por
aplicaci
on de la regla de particularizaci
on:
7 aqu
Invertir Cdr1 es el resultado de renombrar el Invertir Cdr en la segunda
cl
ausula del predicado invertir e Invertir1 es el resultado de renombrar el Invertir de
la pregunta.
73
74
Prolog y C
alculo de Predicados
8 aqu
75
Lo que es equivalente a
(Invertir Cdr1 , Invertir1 , Invertir Cdr2 :
invertir([ ], Invertir Cdr2 )
concatenar(Invertir Cdr2 , [2], Invertir Cdr1 )
concatenar(Invertir Cdr1 , [1], Invertir1 ))
Al considerar la aplicaci
on de la regla de generalizaci
on a
dicha conclusi
on en la primera cl
ausula del predicado invertir,
tendremos:
(Invertir Cdr1 , Invertir1 :
invertir([ ], [ ])
concatenar([ ], [2], Invertir Cdr1 )
concatenar(Invertir Cdr1 , [1], Invertir1 )),
invertir([ ], [ ])
(Invertir Cdr1 , Invertir1 :
invertir([ ], [ ])
concatenar([ ], [2], Invertir Cdr1 )
concatenar(Invertir Cdr1 , [1], Invertir1 ))
invertir([ ], [ ])
y al concatenar dominios
(Invertir Cdr1 , Invertir1 :
(invertir([ ], [ ])
concatenar([ ], [2], Invertir Cdr1 )
concatenar(Invertir Cdr1 , [1], Invertir1 ))
invertir([ ], [ ]))
76
Prolog y C
alculo de Predicados
El proceso contin
ua ahora de forma similar para concatenar,
siendo los valores obtenidos para las variables en juego
Invertir Cdr1 [2]
y
Invertir1 [2, 1]
con lo que nuestra respuesta final ser
a
Invertir [2, 1]
Evidentemente podemos generar el a
rbol de resoluci
on
correspondiente, que es el indicado en la figura 5.2, donde
= {Invertir Cdr1 [2], Invertir1 [2, 1]}
2
77
78
Prolog y C
alculo de Predicados
Parte III
El Int
erprete L
ogico
79
Captulo 6
Conceptos Fundamentales
6.1
Objetos en programaci
on l
ogica
Termino
Simple
Variable
N
umero
Constante Caracter
Compuesto
Cadena de caracteres
81
82
Conceptos Fundamentales
fecha
Ano
Mes
Dia
depender
a tan solo del contexto expresado por el programa l
ogico.
6.2. Programas l
ogicos, cl
ausulas y preguntas
6.2
83
Programas l
ogicos, cl
ausulas y preguntas
84
Conceptos Fundamentales
Notaci
on
0
siguiente(0)
siguiente(siguiente(0))
..
.
siguiente(. n. . (siguiente(0)) . . .)
6.3
85
Concepto de unificaci
on: sustituciones e
instancias
86
Conceptos Fundamentales
87
88
Conceptos Fundamentales
{}
|
X=Z
g(Z, Z) = g(X, h(Y ))
T1 = T 2
{X Z}
{X Z}
|
|
g(Z, Z) = g(Z, h(Y ))
Z=Z
Z = h(Y )
{X Z}
|
Z = h(Y )
89
6.4. Un interprete l
ogico simple
{}
|
igual(X, X) = igual(Y, f (Y ))
X =Y
X = f (Y )
{X Y }
|
Y = f (Y )
Observemos que en la u
ltima de las configuraciones Y
aparece en f(Y). Si continuamos con el proceso ocurrir
a
que sustituiremos toda ocurrencia de Y por f(Y), y como
consecuencia obtendremos:
X Y f (Y ) f (f (Y )) f (f (f (Y )))
f (f (f (f (Y )))) . . .
Esto es, la unificaci
on ha entrado en un ciclo. 2
6.4
Un int
erprete l
ogico simple
Selecting a literal, using a Linear strategy and searching the space of possible
deductions Depth-first.
90
Conceptos Fundamentales
Algoritmo:
inicio
Resolvente := {Q} ;
mientras Resolvente 6= hacer
A Resolvente ;
si P : Q1 , . . . , Qn tal que = mgu(A, P ) entonces
borrar (Resolvente, A) ;
a~
nadir (Resolvente, Q1 , . . . , Qn ) ;
aplicar (, Resolvente)
sino
devolver fail
fin si
fin mientras ;
devolver
fin
donde la funci
on borrar(Resolvente, A) borra el objetivo A
de Resolvente, mientras que la funci
on a~
nadir(Resolvente,
Q1 , . . . , Q2 ) a
nade los objetivos indicados a Resolvente.
La funci
on aplicar(, Resolvente) aplica sobre el conjunto
de objetivos de Resolvente la restricci
on representada por la
sustituci
on . En general consideraremos que una resolvente
contiene en cada instante el conjunto de objetivos a resolver. 2
De hecho, existe un formalismo arborescente para representar
las derivaciones efectuadas por nuestro algoritmo 6.4.1. En
dicho arbol, la existencia de una rama cuya u
ltima hoja es la
clausula vaca se traduce en la existencia de una instancia que
es consecuencia logica del programa, esto es, de una respuesta.
En otro caso, no existe ninguna instancia que sea consecuencia
logica del programa.
El arbol en cuestion se denomina a
rbol de resoluci
on. En
el, cada uno de los nodos representa el estado actual de la
resolvente, mientras que las ramas estan etiquetadas con los
valores de las sustituciones aplicadas en el algoritmo 6.4.1.
6.4. Un interprete l
ogico simple
91
Definici
on 6.4.1 Sean P un programa l
ogico y Q una pregunta
para el mismo, entonces el arbol de resolucion para el programa
P , dada la pregunta Q, se construye en la forma siguiente:
1. La raz del a
rbol est
a constituida por la pregunta Q, que es
el primer valor de la resolvente.
2. Una vez seleccionado un a
tomo A en la resolvente, que
llamaremos el objetivo a resolver, la construcci
on del a
rbol
en cada nodo contin
ua como sigue:
(a) Si el a
tomo seleccionado A se puede unificar con la
cabeza de cada una de las cl
ausulas
1
P1 : Q11 , . . . , Qm
1 .
m2
1
P2 : Q2 , . . . , Q2 .
..
.
n
Pn : Q1n , . . . , Qm
n .
92
Conceptos Fundamentales
paraliza la construcci
on de dicha rama y se devuelve
true, adem
as del resultado de la composici
on de las
93
6.4. Un interprete l
ogico simple
Consideremos la pregunta
:- numero natural(siguiente(siguiente(0))).
Entonces, la aplicaci
on directa de la definici
on 6.4.2 puede
representarse gr
aficamente en forma de a
rbol de resoluci
on, cuyo
valor exacto para este caso es el indicado en la figura 6.2.
{ numero_natural(siguiente(siguiente(0))) }
Numero
siguiente(0)
{ numero_natural(siguiente(0)) }
Numero
{ numero_natural(0) }
{ }
true
Figura 6.2:
Arbol
de resoluci
on para
numero natural(siguiente(siguiente(0))).
la
pregunta
:-
94
Conceptos Fundamentales
6.5
El concepto de retroceso
numero natural(siguiente(siguiente(0))).
95
96
Conceptos Fundamentales
siguiente(Numero 1)
{ } { numero_natural(Numero 1) }
true
Numero 1
Numero 1
siguiente(Numero 2)
{ } { numero_natural(Numero 2) }
true
Numero 2
Numero 2
siguiente(Numero 3)
{ } { numero_natural(Numero 3) }
true
97
0
siguiente(Numero1 )
siguiente(0)
siguiente(Numero1 )
siguiente(siguiente(Numero2 ))
siguiente(siguiente(0))
siguiente(Numero1 )
siguiente(siguiente(Numero2 ))
siguiente(siguiente(siguiente(Numero3 )))
siguiente(siguiente(siguiente(0)))
..
.
De hecho la sem
antica declarativa es la correcta, puesto que:
El cero es un n
umero natural par.
El siguiente al siguiente de un n
umero natural Numero
es par, si Numero lo es.
98
Conceptos Fundamentales
cuya sem
antica declarativa es la dada por:
El uno es un n
umero natural impar.
El siguiente al n
umero natural siguiente(Numero)
es impar, si Numero lo es.
Este programa se comporta conforme a lo esperado ante
preguntas como
:- impar(X).
que nos devuelve todos los posibles valores para los n
umeros
naturales impares. Como en el caso del ejemplo 6.5.2 la
respuesta es igualmente satisfactoria para preguntas cuyos
argumentos no incluyen variables. 2
Ejemplo 6.5.4 Como muestra m
as completa de programa
l
ogico vamos a extender el programa del ejemplo 6.4.1 con
el objeto de implementar el concepto de suma de n
umeros
naturales.
Para ello basta considerar el programa l
ogico
siguiente:
99
numero_natural(0).
numero_natural(siguiente(Numero)) :- numero_natural(Numero).
suma(0,Numero,Numero) :- numero_natural(Numero).
suma(siguiente(Numero_1),Numero_2,siguiente(Numero_3)) :suma(Numero_1,Numero_2,Numero_3).
on
donde suma(Sumando 1,Sumando 2,Resultado) es la notaci
de usuario que determina la sem
antica declarativa del predicado
suma, cuyo significado ser
a:
El resultado de la suma de Sumando 1 y Sumando 2
es Resultado.
y a partir de la cual hemos construido las dos cl
ausulas del
predicado suma en la forma:
La suma del cero y de un n
umero cualquiera, es dicho
n
umero si este es natural.
La suma del siguiente al n
umero Numero 1 y un
umero
n
umero arbitrario Numero 2, es el siguiente al n
Numero 3, si Numero 3 es el resultado de sumar
Numero 1 y Numero 2.
{ suma(0,siguiente(siguiente(0)),X) }
Numero
1
Numero
1
siguiente(siguiente(0))
X
{ natural(siguiente(siguiente(0)) }
{ }
true
100
Conceptos Fundamentales
6.6
Significado de un programa l
ogico
101
102
Conceptos Fundamentales
y por tanto las respuestas son en este caso las dadas por:
X 0
Y Numero 11 siguiente(siguiente(0))
X siguiente(Numero 11 ) siguiente(0)
Y Numero 21 siguiente(0))
siguiente(Numero 11 ) siguiente(siguiente(Numero 12 ))
siguiente(siguiente(0))
Numero 21 Numero 22 0
{ suma(X,Y,siguiente(siguiente(0))) }
X
Y
Numero 1
0
Numero 1
siguiente(siguiente(0))
{ numero_natural(siguiente(siguiente(0))) }
Numero_1
1
Numero_2
{ }
X
Y
Numero_3
siguiente(Numero_1 )
1
Numero_2
1
siguiente(0)
siguiente(Numero_1 2)
Numero_2
2
0
true
Numero_1
2
Numero_2
{ }
0
0
{ numero_natural(0) }
true
{ }
true
103
X
Y
Z
{ numero_natural(Numero 1) }
Numero 1
Numero 1
siguiente(Numero 2)
{ } { numero_natural(Numero 2) }
true
Numero 2
Numero 2
siguiente(Numero 3)
{ } { numero_natural(Numero 3) }
true
104
Conceptos Fundamentales
105
106
Conceptos Fundamentales
107
El orden de aplicaci
on de las cl
ausulas
108
Conceptos Fundamentales
persona(Rosa).
persona(Maria).
persona(Nuria).
persona(Persona) :- persona(Madre), madre(Persona, Madre).
madre(Javier, Rosa).
madre(Juan, Maria).
madre(Eva, Nuria).
109
110
Conceptos Fundamentales
Captulo 7
Control en Prolog: el
Corte
Hemos visto la importancia de entender, en la practica, el
orden en el que Prolog resuelve las cuestiones planteadas. En
particular, hemos intuido lo interesante de la posibilidad de
controlar de alg
un modo dicho orden. En este sentido, el corte
es el metodo mas utilizado para establecer un control de la
resolucion en un programa Prolog. Pero no nos enga
nemos, su
utilizacion abrira a su vez nuevos interrogantes.
7.1
Sem
antica operacional
112
a : b1 , . . . , bi1 , !, bi , . . . , br .
b1 : c11,1 , c11,2 , . . . , c11,m1,1 .
..
.
1
1
1
.
, . . . , cl1,m
, cl1,2
b1 : cl1,1
1,l1
..
.
1
1
1
.
, . . . , cn1,m
, cn1,2
b1 : cn1,1
1,n
1
i1
i1
i1
bi1 : ci1,1
, ci1,2
, . . . , ci1,m
.
i1,li1
..
.
i1
i1
i1
bi1 : ci1,1
, ci1,2
, . . . , ci1,m
.
i1,ni1
1
1
1
bi : ci,1 , ci,2 , . . . , ci,mi,1 .
..
.
i
.
bi : cni,1i , cni,2i , . . . , cni,m
i,ni
..
.
113
7.1. Sem
antica operacional
i1
, tal que j1 > l1 , j2 > l2 , . . . , ji1 > li1
bj11 , bj22 , . . . , bi1
programa.
114
7.1. Sem
antica operacional
115
entonces la sem
antica declarativa de nuestro programa es
exactamente la misma, pero la operacional ha cambiado.
Veamos lo que ocurre cuando interrogamos al interprete con
nuestra nueva base de datos. De hecho estaremos en condiciones
de obtener dos soluciones forzando el retroceso, sin embargo este
esfuerzo de c
alculo es in
util puesto que la segunda respuesta
es la misma que la primera. M
as exactamente, las respuestas
obtenidas son:
X Numero1 0
X Numero 31 0
siendo el correspondiente a
rbol de resoluci
on el mostrado en la
figura 7.2. 2
Este u
ltimo ejemplo 7.1.1 muestra una de las aplicaciones
fundamentales del corte, a saber, la determinizacion del proceso
de resolucion con el objetivo final de eliminar soluciones que
bien por la naturaleza del problema2 , bien por la naturaleza del
codigo3 , hemos decidido no tener en cuenta.
Ejemplo 7.1.2 A partir de la definici
on de multiplicaci
on de
n
umeros naturales considerada en el anterior ejemplo 7.1.1,
podemos construir un predicado
exp(Base, Exponente, Resultado)
2 del
116
X
Numero
{ mult(siguiente(0),0,X) }
Numero
1
X
Numero_11
Numero_2
Numero_3 1
0
0
{ numero_natural(0) }
{ }
0
0
{ suma(0,0,Numero_3 ) }
1
true
Numero_3
{ numero_natural(0) }
{ }
true
{ mult(siguiente(0),0,X) }
X
Numero 1
Numero 1
0
{ !, numero_natural(0) }
{ numero_natural(0) }
{ }
true
7.1. Sem
antica operacional
117
donde las u
nicas cl
ausulas introducidas en relaci
on al
ejemplo 7.1.1 son las tres u
ltimas, cuya sem
antica declarativa
viene dada por:
El resultado de elevar un n
umero natural Numero a
la potencia uno, es ese mismo n
umero.
El resultado de elevar un valor numerico cualquiera
a la potencia cero, es el uno.
El resultado Resultado de elevar un n
umero Numero
al n
umero natural siguiente a Exponente, es igual
a calcular la potencia Exponente de dicho n
umero
Numero y multiplicar el resultado Parcial de dicha
operacion nuevamente por Numero.
118
119
7.1. Sem
antica operacional
cuya sem
antica declarativa es la siguiente:
El n
umero de padres de Adan es cero.
El n
umero de padres de Eva es cero.
Cualquier persona tiene dos padres.
sin embargo, la posibilidad de efectuar retrocesos imprevistos
hace que nuestra sem
antica operacional difiera de nuestra idea
original. En efecto, consideremos la pregunta:
:- numero de padres(Adan,X).
obtendremos dos respuestas distintas si el retroceso es forzado:
X0
X2
4 en
la exploraci
on de tales alternativas se obtendra finalmente un fail como
respuesta.
120
{ }
{ }
true
true
121
7.1. Sem
antica operacional
M
as exactamente, no hemos guiado adecuadamente a nuestro
interprete durante la resoluci
on. Una soluci
on efectiva sera la
siguiente:
numero_de_padres(Adan,N) :- !, N=0.
numero_de_padres(Eva,N) :- !, N=0.
numero_de_padres(Persona,2).
{ numero_de_padres(adan,2) }
{ }
{ }
true
true
introducidos m
as tarde.
122
cuya sem
antica declarativa viene dada por:
Si Objetivo es cierto, demostrarlo.
Si Objetivo no es cierto, devolver true.
La raz
on que justifica en este caso la consideraci
on de un corte
como u
ltimo literal en la parte derecha de la primera cl
ausula,
es que cuando Objetivo ha sido demostrado ya sabemos que la
respuesta debe ser afirmativa, y ello sin tener que recurrir a la
relaci
on expresada por la segunda cl
ausula. 2
7.2
Tipos de cortes
7.2.1
123
El corte verde
El corte rojo
124
En este sentido, esta claro que el uso del corte debe ser moderado
con el fin de mejorar la eficacia sin por ello comprometer la
claridad de nuestros programas.
7.3
Las variables an
onimas
125
fail
fail
R1
{ if_then_else(fail,fail,true) }
true
P
1
Q
1
R1
fail
fail
true
{ fail, !, fail }
{ true }
{ fail, !, fail }
fail
{ }
fail
true
P
1
Q
1
R1
fail
fail
true
{ true }
{ }
true
El ejemplo 7.1.5 no es el u
nico de los anteriormente mostrados
que es susceptible de incluir el concepto de variable anonima.
As por ejemplo, la nocion es perfectamente aplicable al
ejemplo 7.1.6 que implementaba el predicado intentar, como
se ilustra en el ejemplo que sigue.
126
Ejemplo 7.3.1 En el c
odigo correspondiente al ejemplo 7.1.6,
la segunda cl
ausula incluye un argumento cuya unificaci
on
explcita es irrelevante para el proceso de resoluci
on. As, las
reglas a considerar pueden ser las siguientes:
intentar(Objetivo) :- Objetivo,!.
intentar(_).
Captulo 8
La Negaci
on
La definicion de la negacion en programacion logica es, todava
hoy, un problema abierto. De hecho, constituye una de las
muestras emblematicas de la diferencia existente entre logica
estricta y programacion logica en la practica.
8.1
El predicado fail
127
128
La Negaci
on
numero_natural(0).
numero_natural(siguiente(Numero)) :- numero_natural(Numero).
inferior_o_igual(0,Numero) :- numero_natural(Numero).
inferior_o_igual(siguiente(Numero_1), siguiente(Numero_2) :inferior_o_igual(Numero_1,Numero_2).
cuya sem
antica declarativa viene indicada por el predicado
inferior o igual(Numero 1,Numero 2)
que suponemos cierto si Numero1 Numero2 . 2
Ejemplo 8.1.2 Supongamos ahora, que deseamos implementar
el concepto inferior a ... en los n
umeros naturales. Es
obvio que gran parte del programa ser
a en esencia com
un al
considerado en el ejemplo 8.1.1, con una salvedad: necesitamos
afirmar que el cero no es inferior a s mismo. El predicado fail
nos permitir
a hacerlo. Una primera versi
on podra ser la dada
por:
numero_natural(0).
numero_natural(siguiente(Numero)) :- numero_natural(Numero).
inferior(0,0) :- fail.
inferior(0,Numero) :- numero_natural(Numero).
inferior(siguiente(Numero_1), siguiente(Numero_2)) :inferior(Numero_1,Numero_2).
129
numero_natural(0).
numero_natural(siguiente(Numero)) :- numero_natural(Numero).
inferior(0,0) :- !, fail.
inferior(0,Numero) :- numero_natural(Numero).
inferior(siguiente(Numero_1), siguiente(Numero_2) :inferior(Numero_1,Numero_2).
{ inferior(0,0) }
Numero
{ numero_natural(0) }
fail
true
El nuevo a
rbol de resoluci
on se muestra en la figura 8.2. 2
{ inferior(0,0) }
fail
130
La Negaci
on
donde la primera cl
ausula asegura que en el caso de unificaci
on
de los dos argumentos del predicado, se produzca un fallo sin
posibilidad de retroceso sobre la segunda cl
ausula que s
olo ser
a
accesible si los argumentos no son unificables. 2
8.2
La negaci
on por fallo
131
8.2. La negaci
on por fallo
{ true, fail }
true
{ fail }
fail
132
La Negaci
on
{ not(true) }
{ true, !, fail }
{ !, fail }
{ fail }
fail
8.3
Anomalas de la negaci
on por fallo
cuya sem
antica operacional1 es la siguiente:
1 el
133
134
La Negaci
on
Persona
Luisa
fail
135
se efect
ua con un predicado que no contiene variables. En esta
situaci
on, la implementaci
on considerada para la negaci
on por
fallo se comporta como la negaci
on l
ogica cl
asica y el resultado
es el esperado a partir de nuestra base de datos, en la que Teresa
no aparece como una persona guapa.
{ fea(Teresa) }
Persona
Teresa
{ not(guapa(Teresa)) }
{ guapa(Teresa), !, fail }
true
fail
El u
ltimo caso considerado es ilustrativo como ejemplo de dos
situaciones distintas en relaci
on al proceso de resoluci
on de un
objetivo:
1. La influencia del orden de resoluci
on de los objetivos en la
resolvente. Para ello basta ver la forma de la pregunta en
relaci
on a la primera de las formuladas en este ejemplo.
2. El hecho de que, respondiendo afirmativamente a la
pregunta como en el segundo caso, aqu obtengamos adem
as
como respuesta una sustituci
on.
Como es habitual, es suficiente con centrar nuestra atenci
on en
el correspondiente a
rbol de resoluci
on para detectar las causas
del comportamiento observado. As, a partir de la figura 8.7 el
136
La Negaci
on
Teresa
{ fea(Teresa) }
{ not(guapa(Teresa)) }
{ guapa(Teresa), !, fail}
true
fail
137
cuya sem
antica declarativa es la dada por
Una persona es un soltero si no esta casada y ademas
es un varon.
El lector puede verificar f
acilmente que la sem
antica operacional
coincide con la declarativa en este caso, as para las preguntas
:- soltero(X).
:- soltero(Juan).
:- soltero(Pepe).
obtenemos las respuestas
X Pepe
fail
true
respectivamente. Consideremos ahora un peque
no cambio en el
orden de los terminos del predicado soltero, para obtener el
nuevo programa
soltero(Persona) :- not(casado(Persona)), varon(Persona).
casado(Juan).
varon(Juan).
varon(Pepe).
138
La Negaci
on
cuya sem
antica declarativa es la misma del anterior, puesto que
esta no vara con el orden de los terminos. Entonces en relaci
on
a las mismas preguntas, las respuestas respectivas obtenidas son
las siguientes:
fail
fail
true
Esto es, la primera no coincide con la obtenida para el programa
anterior, ni con la sem
antica declarativa considerada. La raz
on
vuelve a ser de nuevo el hecho de que cuando se resuelve la
negaci
on, en el primer caso, el objetivo correspondiente contiene
una variable Persona sin instanciar. Observemos que ese no es
el caso de la segunda y tercera preguntas, en las que adem
as el
resultado coincide con el obtenido para las mismas cuestiones en
el programa anterior. 2
Captulo 9
Control de la Evaluaci
on
En este captulo se va a tratar un conjunto de predicados que
permiten retardar la evaluacion de los objetivos hasta que cierta
informacion que se considera necesaria este disponible. Este tipo
de tecnicas se suele conocer bajo la denominacion de evaluaci
on
perezosa. Con ello se consigue una mejora en el rendimiento, a
la vez que proporciona un mecanismo que facilita la definicion
del comportamiento requerido.
9.1
La primitiva freeze
139
140
Control de la Evaluaci
on
141
cuya sem
antica declarativa contin
ua siendo la misma que
entonces:
Una persona es un soltero si no esta casada y ademas
es un varon
Sin embargo, en este caso el lector puede comprobar
que la sem
antica operacional coincide con la declarativa
independientemente del orden de los terminos del predicado
soltero. Por tanto, al formular las preguntas
:- soltero(X).
:- soltero(Juan).
:- soltero(Pepe).
obtendremos las respuestas
X Pepe
fail
true
142
Control de la Evaluaci
on
La raz
on de este comportamiento estriba en el hecho de que
la resoluci
on de la negaci
on se retarda hasta el momento en
que la variable Persona este instanciada, con lo cual, si en la
pregunta se utiliza una variable, se resolver
a primero el termino
correspondiente a varon.2
Un caso distinto se plantea con el del ejemplo 8.3.1, puesto
que al estar constituida la cola de la clausula encabezada por
fea(Persona) por un u
nico termino, no es posible congelarlo
en espera de que el proceso de resolucion instancie la variable
Persona. En este caso la solucion viene dada por la utilizacion
de declaraciones wait.
9.2
La declaraci
on wait
9.2. La declaraci
on wait
143
y que la sem
antica declarativa de la u
ltima regla era
Una persona es fea, si no se puede probar que es
guapa
El problema surga al realizar las preguntas
:- fea(X),igual(X,Teresa).
:- igual(X,Teresa),fea(X).
para las que obtenemos dos respuestas distintas, ya que
el diferente orden de evaluaci
on provoca variaciones en la
instanciaci
on de las variables. Concretamente, el problema
surge cuando se eval
ua primero el predicado fea, ya que su
variable no puede ser instanciada. Utilizando la declaraci
on
wait fea(0).
antes de definir el predicado fea, retardamos la evaluaci
on de
fea hasta que su variable este instanciada, hecho que ocurre
cuando se lleva a cabo la evaluaci
on del predicado igual.2
144
Control de la Evaluaci
on
Parte IV
Programaci
on L
ogica
145
Captulo 10
Las Listas
Si bien los lenguajes de programacion logica en general, y Prolog
en particular, no han sido optimizados para el tratamiento de
listas, estas constituyen un magnfico campo de experimentacion
para las tecnicas de programacion logica, en especial para el
concepto de unificacion. Comenzaremos por definir lo que es una
lista. Esencialmente, se trata de estructuras de almacenamiento
de datos con dos caractersticas que las diferencian de otros tipos
de estructuras:
Una lista es una estructura de datos dinamica, esto es, su
tama
no puede variar en el curso de la sesion de trabajo.
Es ademas una estructura de tipo secuencial. Esto es, para
acceder a un elemento contenido en una lista es necesario
recorrer previamente todos los que le preceden.
En nuestro caso, una lista se representara por la sucesion de sus
elementos separados por comas, y encerrada entre corchetes. As
por ejemplo, la lista cuyo primer elemento es a, cuyo segundo
elemento es b y cuyo tercer elemento es c, se representara en la
forma:
[a,b,c]
La implementacion fsica de la estructura de datos lista se centra
en el concepto de celula o doblete. Elemento mnimo de una lista,
la celula, esta compuesta de dos partes, el car y el cdr:
147
148
Las Listas
[ ]
[ ]
inadecuado.
10.1. Definici
on del tipo lista
10.1
149
Definici
on del tipo lista
10.2
150
Las Listas
cuya sem
antica declarativa es la que sigue:
El primer elemento de una lista es el car de la
misma.
Todo aquello que sigue al primer elemento de una
lista es el cdr de la misma.
Observemos que para escribir nuestro programa s
olo hemos
tenido en cuenta la notaci
on utilizada para representar una lista,
y sobre todo, el mecanismo de unificaci
on que nos asegura que
las respuestas al primer predicado ser
an instancias de la variable
Car, y las del segundo instancias de Cdr.
Tambien es curioso hacer se
nalar que si bien Car y Cdr son
variables que aparecen una sola vez por cl
ausula, no tendra
sentido el considerarlas como variables an
onimas puesto que son
necesarias para obtener la respuesta deseada en cada caso. 2
En este punto es importante se
nalar que los predicados car y
cdr no seran nunca usados tal y como han sido definidos en el
ejemplo 10.2.1. En efecto, ambos conceptos son directamente
aplicables mediante el concepto de unificacion. En ese sentido,
el anterior ejemplo tiene solo un valor testimonial tal y como se
muestra en el siguiente.
151
152
Las Listas
Elemento
1
1
{!}
true
es la causa u
ltima de este comportamiento, puesto que corta
toda posibilidad de b
usqueda de otras soluciones. Ello podra
plantear la supresi
on del mismo, lo cual resolvera este problema
en particular, pero planteara el de la duplicidad de soluciones
con preguntas del tipo
:- miembro(1,[1,2,1,3,1]).
en caso de retroceso, tal y como habamos comentado en
un principio. Esto es, sacrificamos la completud de nuestro
programa en favor de su eficiencia. Ello ilustra la confrontaci
on,
habitual, entre eficiencia y congruencia declarativo/operacional
3 de
153
X
Y
Elemento
1
[ Elemento | _ ]
{ miembro(X, Y) }
X
Y
{ miembro(Elemento 1, Cdr1 ) }
{ }
Elemento
Elemento 2
1
Cdr 1
[ Elemento 2 , _ ]
true
Elemento
1
[ _ | Cdr ]
{ }
Elemento 2
Elemento
1
Cdr 1
[ _ | Cdr2 ]
{ miembro(Elemento , Cdr ) }
2
true
154
Las Listas
X Elemento1
Y [Elemento1 | ]
X Elemento1
Y [ , Elemento1 | ]
X Elemento1
Y [ , , Elemento1 | ]
X Elemento1
Y [ , , , Elemento1 | ]
...
155
programa l
ogico dependen en gran parte del proceso
de unificaci
on aplicado en la resoluci
on.
Ejemplo 10.2.3 El ejemplo a considerar ahora es la
implementaci
on de un predicado concatenar(Lista 1 ,Lista2 ,
Resultado) describiendo la concatenaci
on de listas Lista 1 y
Lista2 para obtener la nueva lista resultado. La idea no
es otra que la de recorrer la primera lista hasta el final, para
luego concatenarle los elementos de la segunda. Formalmente,
la implementaci
on podra ser la siguiente:
concatenar([],Lista,Lista).
concatenar([Car|Cdr],Lista,[Car|Resultado]) :concatenar(Cdr,Lista,Resultado).
cuya sem
antica declarativa puede ser
La concatenacion de la lista vaca con otra lista
cualquiera, es esta u
ltima.
La concatenacion de una lista [Car | Cdr] con otra
lista arbitraria Lista es el resultado de concatenar el
Car al resultado Resultado previamente obtenido de
la concatenacion de Cdr con Lista.
Tambien en este caso podemos constatar la potencia de
c
alculo imprimida por la aplicaci
on de la unificaci
on a nuestro
programa, que describe en apenas dos lneas la concatenaci
on de
listas. Sirva como muestra el comportamiento del programa ante
una pregunta de la forma
:- concatenar(X,Y,Z).
obteniendo como respuestas
X []
Y Lista1
Z Lista1
X [Car1 Car2 ]
Y Lista1
X [Car1 ]
Y Lista1
Z [Car1 | Lista1 ]
156
Las Listas
cuya sem
antica declarativa viene dada por
157
cual subraya el hecho de que una lista vaca no es realmente una lista.
158
Las Listas
159
2
Ejemplo 10.2.7 Abordamos en este ejemplo el problema de la
duplicaci
on de listas. Se trata de implementar un predicado
duplicar(Lista, Duplicaci
on) que sea cierto s
olo en el caso
en el que Duplicaci
on sea el resultado de concatenar la lista
Lista consigo mismo. Una posible utilizaci
on sera
:- duplicar([1,2], X).
para la que deberamos obtener como respuesta
X [1, 2, 1, 2]
Claramente, una posible soluci
on pasara por usar directamente
el predicado concatenar anteriormente definido en
el ejemplo 10.2.3. Sin embargo, y por razones exclusivamente
did
acticas, no lo usaremos. En ese caso, una posible soluci
on es
la dada por el programa:
duplicar(Lista,Dup) :- duplicar_aux(Lista,Lista,Dup).
duplicar_aux([],Lista,Lista).
duplicar_aux([Car|Cdr],Lista,[Car|Duplicado_Cdr]) :duplicar_aux(Cdr,Lista,Duplicado_Cdr).
cuya sem
antica declarativa es obvia. 2
160
Las Listas
10.3
El tipo conjunto
161
La uni
on
162
Las Listas
La uni
on de un conjunto con otro de la forma
[Car|Cdr], da como resultado el mismo que el de
la uni
on con Cdr, en el caso en el que Car sea un
elemento de la uni
on de dicho conjunto con Cdr.
La uni
on de un conjunto con otro de la forma
[Car|Cdr], da como resultado [Car|Union con Cdr]
donde Union con Cdr es la uni
on con Cdr, en el caso
en el que Car no sea un elemento de Union con Cdr.
La consideracion del corte en la segunda de las clausulas
viene justificada por la necesidad de cortar las posibilidades
de retroceso cuando Car sea un elemento del resultado de la
union de Conjunto y Cdr. En este sentido, es necesario recordar
que la u
ltima de las clausulas solo tiene sentido cuando Car no
pertenece a dicha union. Se trata en definitiva de un nuevo caso
de corte rojo.
10.3.3
La inclusi
on
La intersecci
on
163
164
Las Listas
10.3.5
El producto cartesiano
La u
ltima operacion sobre conjuntos que vamos a tratar es el
producto cartesiano de dos conjuntos. Para ello consideraremos
el predicado
cartesiano(Conjunto 1,Conjunto 2,Cartesiano)
que sera cierto cuando Cartesiano sea el producto cartesiano
de los conjuntos Conjunto 1 y Conjunto 2. Analticamente, el
programa viene dado por las clausulas siguientes
cartesiano([],Conjunto,[]).
cartesiano([Car|Cdr],Conjunto,Resultado) :linea(Car,Conjunto,Linea),
cartesiano(Cdr,Conjunto,Resto),
concatenar(Linea,Resto,Resultado).
linea(Elemento,[],[]).
linea(Elemento,[Car|Cdr],[[Elemento,Car]|Resto]) :linea(Elemento,Cdr,Resto).
Captulo 11
T
ecnicas de Programaci
on
El problema planteado en el anterior ejemplo 10.2.4, no es una
situacion aislada, sino bastante com
un entre los programadores
inexpertos para los que la maxima
Si el ordenador lo hace, es que necesariamente el
algoritmo es r
apido.
es valida, lo cual supone una velocidad infinita del ordenador ...
grave error. En efecto, la aplicacion de la recursividad no debe
ser ciega y debera estar supeditada a criterios de complejidad
algortmica, al menos cuando la aplicacion a desarrollar exija
un mnimo de eficiencia tanto temporal como espacial bien por
la complejidad de la misma, bien por la escasez de los recursos
disponibles. Ello sera objeto de un estudio mas detallado, pero
por el momento nos limitaremos a mostrar que no todos los
problemas exigen el uso de la recursividad y que esta puede, a
veces, ser eliminada si ello fuese requerido.
11.1
Los acumuladores
166
Tecnicas de Programaci
on
cuya sem
antica declarativa es la siguiente:
Invertir una lista seg
un el predicado invertir/2
equivale a invertirla con el predicado invertir/3, con
un acumulador inicial que es la lista vaca.
El resultado de invertir una lista vaca con un
acumulador inicial dado, es este mismo acumulador.
El resultado de invertir una lista [Car|Cdr] con
un acumulador inicial dado, es igual al resultado
de invertir Cdr con un nuevo acumulador que es
el resultado de a
nadir Car en cabeza del anterior
acumulador.
La sem
antica operacional es identica a la del c
odigo del
ejemplo 10.2.4, si bien la complejidad espacial y temporal es
considerablemente inferior en la nueva versi
on. 2
Es importante observar que el uso del acumulador es en
este programa transparente para el usuario. Ello facilita su
utilizacion y hace el codigo mas elegante. Por otro lado, y
en relacion a nuestro objetivo inicial, es evidente que hemos
eliminado la llamada al predicado concatenar y con ello los
recorridos in
utiles de nuestra lista argumento a invertir.
Siguiendo en la misma tonica, presentamos ahora un nuevo
ejemplo, que de hecho es continuacion del anterior 10.2.5 en el
167
168
Tecnicas de Programaci
on
2
La consideracion del concepto de acumulador, no es privativa
de las listas. Se trata de una tecnica general, aplicable
a cualquier tipo de estructura de datos. Para ilustrarlo,
abordaremos un problema numerico recursivo tpico: la
definicion del factorial de un n
umero. En primer lugar,
ilustraremos la definicion recursiva del concepto para despues
pasar a la implementacion con acumuladores. Ante todo,
debemos recordar que la definicion matematica de factorial de
un n
umero natural es la siguiente:
n! =
1
si
n=0
n (n 1)! en otro caso
numero_natural(0).
numero_natural(siguiente(Numero)) :- numero_natural(Numero).
169
suma(0,Numero,Numero) :- numero_natural(Numero).
suma(siguiente(Numero_1),Numero_2,siguiente(Numero_3)) :suma(Numero_1,Numero_2,Numero_3).
mult(0,Numero,0) :- numero_natural(Numero).
mult(siguiente(0),Numero,Numero) :- !, numero_natural(Numero).
mult(siguiente(Numero_1),Numero_2,Numero_3) :mult(Numero_1,Numero_2,Numero_4),
suma(Numero_4,Numero_2,Numero_3).
factorial(0, siguiente(0)).
factorial(siguiente(Numero), Factorial) :factorial(Numero, Parcial),
mult(siguiente(Numero), Parcial, Factorial).
170
Tecnicas de Programaci
on
numero_natural(0).
numero_natural(siguiente(Numero)) :- numero_natural(Numero).
suma(0,Numero,Numero) :- numero_natural(Numero).
suma(siguiente(Numero_1),Numero_2,siguiente(Numero_3)) :suma(Numero_1,Numero_2,Numero_3).
mult(0,Numero,0) :- numero_natural(Numero).
mult(siguiente(0),Numero,Numero) :- !, numero_natural(Numero).
mult(siguiente(Numero_1),Numero_2,Numero_3) :mult(Numero_1,Numero_2,Numero_4),
suma(Numero_4,Numero_2,Numero_3).
factorial(Numero,Factorial) :factorial_ac(Numero,siguiente(0),Factorial).
factorial_ac(0, Factorial, Factorial).
factorial_ac(Numero, Acumulador, Factorial) :mult(Numero, Acumulador, Parcial),
suma(X, siguiente(0), Numero),
factorial_ac(X, Parcial, Factorial).
171
nuevos predicados no l
ogicos. El programa aplica el mismo
formalismo notacional que el del ejemplo 10.2.6, y viene dado
por las cl
ausulas siguientes
longitud([],0).
longitud([Car|Cdr],Longitud) :- longitud (Cdr,Longitud_cdr),
Longitud is 1 + Longitud_cdr.
11.2
172
Tecnicas de Programaci
on
Diferencias de listas
173
X\Y
Y\Z
X\Z
podemos asociarle un n
umero infinito
equivalentes, utilizando diferencias de listas:
de
expresiones
[1, 2] \ [ ]
[1, 2, 3] \ [3]
[1, 2, 3, 4] \ [3, 4]
..
.
[1, 2 | X] \ X
Como nuevo ejemplo ilustrativo, consideraremos en primer
lugar una implementacion del predicado invertir cuya
semantica fue ya descrita en los ejemplos 10.2.4 y 11.1.1, pero
utilizando ahora la tecnica de las diferencias de listas.
Ejemplo 11.2.1 La nueva versi
on del predicado invertir,
mediante aplicaci
on del concepto de lista incompleta, queda
definida por el siguiente conjunto de reglas:
invertir(Lista,Invertir) :- invertir_dl(Lista,Invertir\[]).
invertir_dl([Car|Cdr],Invertir\Cola) :invertir_dl(Cdr,Invertir\[Car|Cola]).
invertir_dl([],Invertir\Invertir).
174
Tecnicas de Programaci
on
175
176
Tecnicas de Programaci
on
{ aplanar([ a | [ [ b ] ] ], Resultado)}
Resultado
Lista 1
Resultado 1
[a|[[b]]]
{ aplanar_dl( [ a | [ [ b ] ] ], Resultado \ [ ] ) }
1
a
[[b]]
Cabeza 1
[]
Car 1
Cdr 1
Resultado 1
Dif 1
Atomo
1
Dif_car
Cdr
Cabeza 1
[ a | Cdr 2]
a
2
{ aplanar_dl( [ [ b ] ], Cdr 2\ [ ] ) }
Car3
Cdr3
[b]
[]
Cabeza 3
[]
Cdr
Dif 3
Car4
Cdr 4
[]
Cabeza 4
Cabeza 3
Dif 4
Dif_car3
Cabeza 4
Dif_car
[ b | Cdr 5]
Cdr 5
Cdr
Dif_car3
{ aplanar_dl ( [ ], Dif_car 3\ [ ] ) }
Dif_car
[]
{ }
true
177
178
Tecnicas de Programaci
on
B
asicamente la idea es muy simple. En efecto, tomando como
base el programa inicial de inversi
on de listas del ejemplo 11.2.1,
lo que hacemos es a
nadir los elementos de la lista, a la lista
misma en proceso de inversi
on en la cl
ausula recursiva. 2
11.2.2
Diferencias de estructuras
179
+
+
+
a
d
+
0
(a+b) + (c+d)
a
((a+b) + c) + d
180
Tecnicas de Programaci
on
+
181
X ++ Y
Y ++ Z
X ++ Z
respecto
al
predicado
primera cl
ausula es simplemente de interfaz para el operador ++.
182
Tecnicas de Programaci
on
Captulo 12
Predicados No L
ogicos
Los programas logicos basados exclusivamente en los conceptos
de unificacion y resolucion son sin duda elegantes, pero no es
menos cierto que su ineficacia es manifiesta desde un punto
de vista exclusivamente temporal, en muchos casos. As
por ejemplo, la implementacion de la operacion suma en el
ejemplo 6.5.4 se encuentra a unos niveles de eficiencia, en cuanto
a la velocidad de tratamiento se refiere, muy por debajo de las
posibilidades ofrecidas por los microprocesadores de uso com
un
mediante la aplicacion de instrucciones apropiadas.
A este respecto, los distintos dialectos de Prolog incluyen una
serie de predicados no logicos predefinidos cuya funcion es la de
implementar funcionalidades que no expresan ning
un tipo de
relacion logica entre objetos.
12.1
Predicados aritm
eticos
184
Predicados No L
ogicos
185
12.2
= Y
< Y
=< Y
> Y
>= Y
Cierto
Cierto
Cierto
Cierto
Cierto
si
si
si
si
si
X
X
X
X
X
es
es
es
es
es
igual a Y.
menor que Y.
menor o igual que Y.
mayor que Y.
mayor o igual que Y.
Entradas y salidas
el teclado.
el terminal.
186
Predicados No L
ogicos
12.3
Predicados de memorizaci
on
m
as exactamente, por el flujo de salida actual.
187
siX = 0
0
1
siX = 1
fibonacci(X) =
188
Predicados No L
ogicos
189
cuya sem
antica operacional viene dada por:
La primera vez que se ejecuta, assertb(Clausula)
funciona tal y como lo hara asserta(Clausula).
En caso de retroceso sobre el objetivo
assertb(Clausula), retiramos la clausula Cl
ausula
de la base de datos del interprete y continuamos con
el retroceso.
Es importante se
nalar que la inclusi
on del predicado fail
al final de la segunda alternativa del predicado assertb es
necesaria con el objeto de conseguir que el proceso natural de
retroceso del interprete no se vea interrumpido. En efecto,
si eliminamos dicho fail el resultado ser
a que el proceso de
retroceso se pare en la segunda alternativa de assertb puesto
que retract(Clausula) se verificar
a siempre por definici
on
190
Predicados No L
ogicos
191
concatenar([],Lista,Lista) :- !.
concatenar([Car|Cdr],Lista,[Car|Resultado]) :concatenar(Cdr,Lista,Resultado).
hanoi(1,A,B,_,[A a B]).
hanoi(N,A,B,C,Movimientos) :N > 1,
N1 is N - 1,
hanoi(N1,A,C,B,Movimientos_1),
hanoi(N1,C,B,A,Movimientos_2),
concatenar(Movimientos_1,[A a B|Movimientos_2],Movimientos).
1)
2)
3)
4)
192
Predicados No L
ogicos
193
Por inducci
on, se puede demostrar que la complejidad del
problema es de 2N 1 movimientos para N discos. Por ejemplo,
en el caso de N = 10, el n
umero total de movimientos utilizando
esta versi
on es de:
2101 = 29 = 512
2
12.4
Predicados metal
ogicos
194
Predicados No L
ogicos
12.5. Comentarios
195
2
El ejemplo comentado, ilustra perfectamente la utilidad
fundamental del tipo de predicados estudiado: el test metal
ogico.
Mas exactamente, se trata de utilizar un predicado para decidir,
en funcion del estado actual del interprete, que opcion de
resolucion debemos seguir. Si bien el conjunto de predicados
metalogicos ofertados depende en general del dialecto Prolog
utilizado, los mas usuales son los siguientes:
Es cierto cuando X es una variable instanciada.
Es cierto cuando X es una variable
sin instanciar.
atom(X)
Es cierto cuando X esta instanciada a un valor
que es un atomo.
number(X) Es cierto cuando X esta instanciada a un valor
que es un n
umero.
integer(X) Es cierto cuando X esta instanciada a un valor
que es un n
umero entero.
float(X)
Es cierto cuando X esta instanciada a un valor
que es un n
umero real.
atomic(X) Es cierto cuando X esta instanciada a un valor
que es un atomo o un n
umero.
nonvar(X)
var(X)
12.5
Comentarios
196
Predicados No L
ogicos
5 s
olo sistemas en los que el analizador sint
actico tenga asociada una aplicaci
on que
exija la recuperaci
on ntegra del texto a partir del a
rbol de derivaci
on, requieren que los
comentarios tengan un tratamiento especfico a este nivel. Tal es el caso del entorno de
generaci
on de lenguajes Centaur [9].
Captulo 13
Los Operadores
Un operador es, en Prolog, simplemente una conveniencia
notacional. As por ejemplo, la expresion 2+1 podra ser notada
como +(2, 1) para representar al arbol
198
Los Operadores
13.1
Definici
on de operadores
2 aquellos
13.1. Definici
on de operadores
13.1.1
199
Operadores binarios
200
Los Operadores
Operadores unarios
13.1. Definici
on de operadores
201
este caso suponemos que op es de tipo fy, es decir, un operador unario prefijo.
202
13.2
Los Operadores
figura a
figura d
figura b
figura e
figura c
figura f
objetivo ser
a el de dise
nar un programa capaz de detectar
las relaciones, indicando su naturaleza. M
as exactamente, a
partir de una relaci
on entre dos objetos y un tercer objeto,
se trata de encontrar el an
alogo a este tercer objeto seg
un la
relaci
on establecida entre los dos primeros. Para alcanzar este
objetivo, la forma de proceder es sistem
atica: se expresan en
203
Xb
Xd
Ya
Yc
Relacion inversion
Relacion contorno
Xd
Xe
Yf
Yf
Relacion contorno
Relacion interior
Xf
Ya
Relacion inversion
204
Los Operadores
analogia(es_a(X,Y),es_a(Z,W),Relacion) :verifican(X,Y,Relacion),
verifican(Z,W,Relacion).
verifican(a,b,inversion).
verifican(a,d,contorno).
verifican(a,e,interior).
verifican(a,f,inversion).
verifican(b,a,inversion).
verifican(b,c,contorno).
verifican(b,f,contorno).
verifican(b,f,interior).
verifican(b,f,igualdad).
verifican(c,b,contorno).
verifican(c,d,interior).
verifican(c,e,inversion).
verifican(c,f,contorno).
verifican(d,a,contorno).
verifican(d,c,interior).
verifican(e,a,interior).
verifican(e,c,inversion).
verifican(f,a,inversion).
verifican(f,b,contorno).
verifican(f,b,interior).
verifican(f,b,igualdad).
verifican(f,c,contorno).
205
Figura
a
b
c
d
e
f
Descripci
on
cuadrado dentro de triangulo
triangulo dentro de cuadrado
circulo dentro de cuadrado
circulo dentro de triangulo
cuadrado dentro de circulo
triangulo dentro de cuadrado
206
Los Operadores
dentro_de
dentro_de
dentro_de
dentro_de
dentro_de
dentro_de
dentro_de
dentro_de
Figura_2,
Figura_2,igualdad).
Figura_2,
Figura_1,inversion).
Figura_2,
Figura_3,interior).
Figura_2,
Figura_2,contorno).
Xb
Xd
Ya
Yc
Relacion inversion
Relacion contorno
Xe
Xd
Yf
Yf
Relacion contorno
Relacion interior
Xf
Ya
Relacion inversion
Captulo 14
L
ogica y An
alisis
Sint
actico
Una vez establecidos los mecanismos fundamentales de la
programacion logica, nuestro objetivo es ahora el de centrarnos
en una de sus aplicaciones fundamentales: el analisis de
lenguajes naturales1 . Ello nos llevara a explotar la relacion
existente entre el dise
no de compiladores logicos para programas
constituidos por clausulas de Horn y el analisis sintactico de
un lenguaje de contexto libre tradicional. Este aspecto fue
observado por primera vez por Colmerauer [5], quien introdujo
el concepto de gram
atica de cl
ausulas definidas, mas conocido
por DCG2 [5, 20].
Intuitivamente, las DCGs son una generalizacion de las
gramaticas de contexto libre, pero a diferencia de estas no son
simples formalismos denotacionales sino tambien operacionales,
esto es, pueden ejecutarse directamente. Mas exactamente,
podemos centrar las principales diferencias en torno a las
siguientes caractersticas:
Los no terminales pueden ser terminos compuestos, por lo
que no estan restringidos a ser simples atomos.
1 esto
2 por
207
208
L
ogica y An
alisis Sint
actico
14.1
Un acercamiento intuitivo
209
P
P
P
C
CP C
C
car
acter
Una t
ecnica simple
210
L
ogica y An
alisis Sint
actico
palindromo(p(C,P,C),X,W) :- caracter(C,X,Y),
palindromo(P,Y,Z),
caracter(C,Z,W).
palindromo(p(nil),X,X).
palindromo(p(C),X,Y) :- Y is X+1, caracter(C,X,Y).
caracter(a,0,1).
caracter(b,1,2).
caracter(a,2,3).
caracter(a,3,4).
caracter(a,4,5).
caracter(b,5,6).
caracter(a,6,7).
14.1.2
211
Una t
ecnica flexible
212
L
ogica y An
alisis Sint
actico
1. Un car
acter C entre las posiciones P0 y P1 y cuyo
a
rbol es C.
2. Un palndromo entre las posiciones P1 y P2, cuyo
a
rbol viene dado por P.
3. El mismo car
acter C entre las posiciones P2 y P3,
con un a
rbol asociado que tambien viene dado por
C.
En todo caso, la palabra vaca es un palndromo.
Tenemos un palndromo entre las posiciones P0 y P1
con un a
rbol asociado p(C), si tenemos un car
acter C
entre esas mismas posiciones.
El car
acter a puede constituir el primer elemento de
una lista. Ello se traduce en este caso en que es una
palabra del diccionario que deseamos reconocer. Esto
es, a es uno de los caracteres que pueden formar parte
de los palndromos que queremos reconocer. El a
rbol
reconocido es en este caso el mismo car
acter a.
El car
acter b verifica las mismas condiciones que el
car
acter a.
14.2
F rase
F rase
F rase
F rase
( F rase )
F rase F rase
caracter
213
214
L
ogica y An
alisis Sint
actico
215
1is
B i
B i B
1ir
216
L
ogica y An
alisis Sint
actico
producciones:
(0)
(1)
(2)
(3)
(4)
S
F rase
F rase
F rase
F rase
F rase
( F rase )
F rase F rase
car
acter
S
S
F rase
F rase
F rase
F rase
F rase
()
( F rase )
F rase F rase
car
acter
S
S
S
S
S
F rase
F rase
F rase
F rase
()
( F rase )
F rase F rase
car
acter
()
( F rase )
F rase F rase
car
acter
217
F rase
Pi Pd
Pi T
F rase F rase
car
acter
Pi Pd
(6)
(7)
(8)
(9)
(10)
(11)
F rase
F rase
F rase
Pi
Pd
T
Pi T
F rase F rase
car
acter
(
)
F rase P d
S
(8) F rase
S
Pi Pd
(9) F rase
S
Pi T
(10) F rase
S
F rase F rase (11) P i
S
car
acter
(12) P d
F rase P i P d
(13) T
F rase P i T
(14) Z
F rase car
acter
(15) Z
Pi Pd Z
Pi T Z
car
acter Z
(
)
F rase P d
F rase Z
F rase
218
L
ogica y An
alisis Sint
actico
Pi Pd
(11) P i
Pi T
(12) P d
F rase F rase (13) T
car
acter
(14) T
Pi Pd
(15) T
Pi T
(16) T
car
acter
(17) T
Pi Pd Z
(18) T
Pi T Z
(19) Z
car
acter Z
(20) Z
(
)
Pi Pd Pd
Pi T Pd
car
acter P d
Pi Pd Z Pd
Pi T Z Pd
car
acter Z P d
F rase Z
F rase
8. En el u
ltimo paso sustituimos los no terminales que
aparecen como primer smbolo del lado derecho de las reglas
por la parte derecha de las producciones en la cual dicho
no terminal aparece como lado izquierdo. Esto es, dadas
3 este
caso se dara si existiese una regla de F rase que tuviese a T como primer smbolo
del lado derecho, lo cual es en principio posible ya que T tiene mayor orden que F rase.
219
las reglas
A B C 1 , C2 . . . Cn
B w1
|
w2
..
.
|
wm
donde A, B, Ci N y wi , la primera de ellas se
transformara en
A w 1 C1 , C2 . . . Cn
|
w2 C1 , C2 . . . Cn
..
.
|
wm C1 , C2 . . . Cn
S
S
S
S
S
S
S
S
S
S
F rase
F rase
F rase
F rase
F rase
F rase
(16) P i
( Pd
(17) P d
(T
(18) T
car
acter
(19) T
( P d F rase
(20) T
( T F rase
(21) T
car
acter F rase (22) T
( Pd Z
(23) T
(T Z
(24) Z
car
acter Z
(25) Z
( Pd
(26) Z
(T
(27) Z
car
acter
(28) Z
( Pd Z
(29) Z
(T Z
(30) Z
car
acter Z
(31) Z
(32) Z
(
)
( Pd Pd
( T Pd
car
acter P d
( Pd Z Pd
( T Z Pd
car
acter Z P d
( Pd
(T
car
acter
( Pd Z
(T Z
car
acter Z
( Pd Z Z
(T ZZ
car
acter Z Z
220
L
ogica y An
alisis Sint
actico
4 este
221
analiza(F,Arbol) :- s(F\[],Arbol).
s(P0\P0,s(nil)).
s(P0\P2,s(Abierto,Pd)) :parentesis_abierto(P0\P1,Abierto), pd(P1\P2,Pd).
s(P0\P2,s(Abierto,T)) :parentesis_abierto(P0\P1,Abierto), t(P1\P2,T).
s(P0\P1,s(Terminal)) :- terminal(P0\P1,Terminal).
s(P0\P3,s(Abierto,Pd,Frase)) :parentesis_abierto(P0\P1,Abierto),
pd(P1\P2,Pd), frase(P2\P3,Frase).
s(P0\P3,s(Abierto,T,Frase)) :parentesis_abierto(P0\P1,Abierto),
t(P1\P2,T), frase(P2\P3,Frase).
s(P0\P2,s(Terminal,Frase)) :terminal(P0\P1,Terminal), frase(P1\P2,Frase).
s(P0\P3,s(Abierto,Pd,Z)) :parentesis_abierto(P0\P1,Abierto),
pd(P1\P2,Pd), z(P2\P3,Z).
s(P0\P3,s(Abierto,T,Z)) :parentesis_abierto(P0\P1,Abierto),
t(P1\P2,T), z(P2\P3,Z).
s(P0\P2,s(Terminal,Z)) :terminal(P0\P1,Terminal), z(P1\P2,Z).
frase(P0\P2,frase(Abierto,Pd)) :parentesis_abierto(P0\P1,Abierto), pd(P1\P2,Pd).
frase(P0\P2,frase(Abierto,T)) :parentesis_abierto(P0\P1,Abierto), t(P1\P2,T).
frase(P0\P1,frase(Terminal)) :- terminal(P0\P1,Terminal).
frase(P0\P3,frase(Abierto,Pd,Z)) :parentesis_abierto(P0\P1,Abierto),
pd(P1\P2,Pd), z(P2\P3,Z).
frase(P0\P3,frase(Abierto,T,Z)) :parentesis_abierto(P0\P1,Abierto),
t(P1\P2,T), z(P2\P3,Z).
pi(P0\P1,pi(Abierto)) :- parentesis_abierto(P0\P1,Abierto).
pd(P0\P1,pd(Cerrado)) :- parentesis_cerrado(P0\P1,Cerrado).
222
L
ogica y An
alisis Sint
actico
t(P0\P3,t(Abierto,Pd,Pd)) :parentesis_abierto(P0\P1,Abierto),
pd(P1\P2,Pd), pd(P2\P3,Pd).
t(P0\P3,t(Abierto,T,Pd)) :parentesis_abierto(P0\P1,Abierto),
t(P1\P2,T), pd(P2\P3,Pd).
t(P0\P2,t(Terminal,Pd)) :terminal(P0\P1,Terminal), pd(P1\P2,Pd).
t(P0\P4,t(Abierto,Pd,Z,Pd)) :parentesis_abierto(P0\P1,Abierto),
pd(P1\P2,Pd), z(P2\P3,Z), pd(P3\P4,Pd).
t(P0\P4,t(Abierto,T,Z,Pd)) :parentesis_abierto(P0\P1,Abierto),
t(P1\P2,T), z(P2\P3,Z), pd(P3\P4,Pd).
t(P0\P3,t(terminal,Z,Pd)) :terminal(P0\P1,Terminal), z(P1\P2,Z), pd(P2\P3,Pd).
z(P0\P2,z(Abierto,Pd)) :parentesis_abierto(P0\P1,Abierto), pd(P1\P2,Pd).
z(P0\P2,z(Abierto,T)) :parentesis_abierto(P0\P1,Abierto), t(P1\P2,T).
z(P0\P1,z(Terminal)) :- terminal(P0\P1,Terminal).
z(P0\P3,z(Abierto,Pd,Z)) :parentesis_abierto(P0\P1,Abierto),
pd(P1\P2,Pd), z(P2\P3,Z).
z(P0\P3,z(Abierto,T,Z)) :parentesis_abierto(P0\P1,Abierto),
t(P1\P2,T), z(P2\P3,Z).
z(P0\P2,z(Terminal,Z)) :terminal(P0\P1,Terminal), z(P1\P2,Z).
z(P0\P4,z(Abierto,Pd,Z,Z)) :parentesis_abierto(P0\P1,Abierto),
pd(P1\P2,Pd), z(P2\P3,Z), z(P3\P4,Z).
z(P0\P4,z(Abierto,T,Z,Z)) :parentesis_abierto(P0\P1,Abierto),
t(P1\P2,T), z(P2\P3,Z), z(P3\P4,Z).
z(P0\P3,z(Terminal,Z,Z)) :terminal(P0\P1,Terminal), z(p1\P2,Z).
terminal([a|X]\X,a).
parentesis_abierto([(|X]\X,().
parentesis_cerrado([)|X]\X,))
Captulo 15
An
alisis del Lenguaje
Natural
El objetivo de este captulo es el de abordar el analisis practico
de textos escritos en lenguaje natural, mediante la utilizacion
de Prolog. Para ello aplicaremos el concepto de DCG, aunque
este caso particular presente caractersticas propias que lo hacen
especialmente interesante, lo que justifica un tratamiento aparte.
Mas concretamente, nuestro objetivo sera el de mostrar la
adecuacion de Prolog para el tratamiento de ciertos problemas
especficos:
La ambig
uedad, a todos los niveles: lexico, sintactico y
semantico.
La existencia de dependencias contextuales, lo cual implica
la introduccion de restricciones semanticas a nivel de las
reglas sintacticas.
Para ilustrar la discusion que sigue, construiremos una
gramatica que describa un peque
no subconjunto del espa
nol,
as como el analizador sintactico capaz de tratarlo. Nuestro
proposito sera ante todo didactico, por lo que en ning
un
momento pretendemos presentar los resultados expuestos como
un sistema completo en cuanto a su dise
no. Por el contrario,
223
224
An
alisis del Lenguaje Natural
15.1
An
alisis sint
actico
Determinante
(11)
N ombre
(12)
V erbo transitivo
F rase
F rase nominal
F rase verbal
Clausula relativa
|
|
|
|
un
una
hombre
mujer
ama
15.1. An
alisis sint
actico
225
esta u
ltima. Una frase verbal esta formada por un verbo,
que en el caso de tener caracter transitivo debe ir seguido por
un complemento directo en la forma de una frase nominal.
Con el objeto de simplificar la presentacion de los conceptos
fundamentales, no se contempla la existencia de complementos
indirectos ni circunstanciales.
15.1.1
Una t
ecnica simple
226
An
alisis del Lenguaje Natural
227
15.1. An
alisis sint
actico
se traduce en1
conecta(1,un,2).
conecta(2,hombre,3).
conecta(3,ama,4).
conecta(4,a,5).
conecta(5,una,6).
conecta(6,mujer,7).
Una t
ecnica flexible
228
An
alisis del Lenguaje Natural
La posici
on de la cadena etiquetada por la lista con
cabeza P y cola S est
a conectada mediante el smbolo
P a la posici
on de la cadena etiquetada como S.
En consecuencia, podramos reescribir la pregunta formulada
anteriormente de la siguiente manera:
:-frase([un,hombre,ama,a,una,mujer]\[]).
Se trata en esencia de repetir el razonamiento que habamos
hecho para el caso del palndromo en la subseccion 14.1.2.
Un diccionario m
as compacto
Una de las primeras ventajas que se obtiene al utilizar DCGs
es la posibilidad de definir el diccionario de una manera mas
compacta y eficiente. Para ello, en vez de utilizar clausulas del
tipo
categora :- palabra.
utilizaremos clausulas de la forma:
categora :- P, es categora(P, S1 , . . . , Sn ).
De este modo, la clausula
nombre(S0\S) :- gato.
se traduce2 en
nombre(Palabra) :- conecta(S0\S,Palabra),
es nombre(Palabra).
con un conjunto adicional de predicados en los que se especifican
los valores validos para que una palabra sea considerada un
nombre. Por ejemplo, mediante
2 los argumentos S , . . . , S
an opcionales, y se reservar
an para la
n se considerar
1
introducci
on de las restricciones sem
anticas derivadas de la consideraci
on de diversos
accidentes gramaticales, tales como las concordancias de genero y n
umero.
15.2. An
alisis sem
antico
229
es_nombre(gato).
es_nombre(perro).
es_nombre(hombre).
es_nombre(mujer).
15.2
An
alisis sem
antico
230
An
alisis del Lenguaje Natural
15.2. An
alisis sem
antico
15.2.1
231
Concordancias de g
enero y n
umero
232
An
alisis del Lenguaje Natural
frase(f(FN,FV),S0\S) :frase_nominal(Numero,FN,S0\S1),frase_verbal(Numero,FV,S1\S).
frase_nominal(Numero,fn(Det,Nom,Rel),S0\S) :determinante(Numero,Det,S0\S1), nombre(Numero,Nom,S1\S2),
clausula_relativa(Numero,Rel,S2\S).
frase_nominal(Numero,fn(a,Det,Nom,Rel),S0\S) :conecta(S0\S1,a), determinante(Numero,Det,S1\S2),
nombre(Numero,Nom,S2\S3),clausula_relativa(Numero,Rel,S3\S).
frase_nominal(Numero,fn(Nom),S0\S) :- nombre(Numero,Nom,S0\S).
frase_verbal(Numero_verbo,fv(VT,FN),S0\S) :verbo_transitivo(Numero_verbo,VT,S0\S1),
frase_nominal(Numero_nombre,FN,S1\S).
frase_verbal(Numero,fv(VI),S0\S) :verbo_intransitivo(Numero,VI,S0\S).
clausula_relativa(Numero,rel(que,FV),S0\S) :conecta(S0\S1,que), frase_verbal(Numero,FV,S1\S).
clausula_relativa(Numero,rel(FV),S0\S) :frase_verbal(Numero,FV,S0\S).
clausula_relativa(Numero,rel(nil),S\S).
determinante(Numero,det(Palabra),S0\S) :conecta(S0\S,Palabra), es_determinante(Numero,Palabra).
nombre(Numero,nom(Palabra),S0\S) :conecta(S0\S,Palabra), es_nombre(Numero,Palabra,Lema).
verbo_transitivo(Numero,vt(Palabra),S0\S) :conecta(S0\S,Palabra), es_verbo_trans(Numero,Palabra,Lema).
es_determinante(singular,un,un).
es_determinante(singular,una,una).
es_determinante(plural,unos,un).
es_determinante(plural,unas,un).
es_nombre(singular,gato,gato).
es_nombre(singular,gata,gato).
es_nombre(plural,gatos,gato).
es_nombre(plural,gatas,gato).
es_verbo_trans(singular,come,comer).
es_verbo_trans(plural,comen,comer).
15.2. An
alisis sem
antico
233
determina el n
umero de la frase verbal.
234
An
alisis del Lenguaje Natural
frase(f(FN,FV),S0\S) :- frase_nominal(Numero,Genero,FN,S0\S1),
frase_verbal(Numero,Genero,FV,S1\S).
frase_nominal(Numero,Genero,fn(Det,Nom,Rel),S0\S) :determinante(Numero,Genero,Det,S0\S1),
nombre(Numero,Genero,Nom,S1\S2),
clausula_relativa(Numero,Genero,Rel,S2\S).
frase_nominal(Numero,Genero,fn(a,Det,Nom,Rel),S0\S) :conecta(S0\S1,a),
determinante(Numero,Genero,Det,S1\S2),
nombre(Numero,Genero,Nom,S2\S3),
clausula_relativa(Numero,Rel,S3\S).
frase_nominal(Numero,Genero,fn(Nom),S0\S) :nombre(Numero,Genero,Nom,S0\S).
frase_verbal(Numero_verbo,fv(VT,FN),S0\S) :verbo_transitivo(Numero_verbo,VT,S0\S1),
frase_nominal(Numero_nombre,Genero,FN,S1\S).
frase_verbal(Numero,fv(VI),S0\S) :verbo_intransitivo(Numero,VI,S0\S).
clausula_relativa(Numero,rel(que,FV),S0\S) :conecta(S0\S1,que),
frase_verbal(Numero,FV,S1\S).
clausula_relativa(Numero,rel(FV),S0\S) :frase_verbal(Numero,FV,S0\S).
clausula_relativa(Numero,rel(nil),S\S).
15.2. An
alisis sem
antico
235
determinante(Numero,Genero,det(Palabra),S0\S) :conecta(S0\S,Palabra),
es_determinante(Numero,Genero,Palabra,Lema).
nombre(Numero,Genero,nom(Palabra),S0\S) :conecta(S0\S,Palabra),
es_nombre(Numero,Genero,Palabra,Lema).
verbo_transitivo(Numero,vt(Palabra),S0\S) :conecta(S0\S,Palabra),
es_verbo_trans(Numero,Palabra,Lema).
es_determinante(singular,masculino,un,un).
es_determinante(singular,femenino,una,una).
es_determinante(plural,masculino,unos,un).
es_determinante(plural,femenino,unas,un).
es_nombre(singular,masculino,gato,gato).
es_nombre(singular,femenino,gata,gato).
es_nombre(plural,masculino,gatos,gato).
es_nombre(plural,femenino,gatas,gato).
es_nombre(singular,raton,raton)
es_nombre(singular,ratones,raton).
es_verbo_trans(singular,come,comer).
es_verbo_trans(plural,comen,comer).
236
An
alisis del Lenguaje Natural
15.2. An
alisis sem
antico
237
238
An
alisis del Lenguaje Natural
conecta([P|S]\S,P).
frase(P, S0\S) :- frase_nominal(X, P2, P, S0\S1),
frase_verbal(X, P2, S1\S).
frase_nominal(X, P2, P2, S0\S) :- nombre_propio(X,S0\S).
frase_nominal(X, P2, P, S0\S) :determinante(X, P1, P2, P, S0\S1),
nombre(X, P3, S1\S2),
clausula_relativa(X, P3, P1, S2\S).
clausula_relativa(X, P3, P3 & P4, S0\S) :conecta(S0\S1, que),
frase_verbal(X, P4,S1\S).
clausula_relativa(_,P3,P3,S0\S0).
frase_verbal(X,P2,S0\S) :- verbo_intransitivo(X, P2, S0\S).
frase_verbal(X,P2,S0\S) :- verbo_transitivo(X, Y, P5, S0\S1),
prep_a(S1\S2),
frase_nominal(Y, P5, P2, S2\S).
prep_a(S0\S) :- conecta(S0\S, a).
prep_a(S\S).
determinante(X,P1, P2, forall(X) : (P1 => P2), S0\S)
conecta(S0\S,
determinante(X, P1, P2, exists(X) : (P1 & P2), S0\S)
conecta(S0\S,
:todo).
:una).
15.2. An
alisis sem
antico
239
240
An
alisis del Lenguaje Natural
P vive(Miguel)
Q [Miguel,vive| A]\ A
P amar(Miguel,Miguel)
Q [Miguel,ama,a,Miguel| A]\ A
P amar(Miguel,Adriana)
Q [Miguel,ama,a,Adriana| A]\ A
15.2. An
alisis sem
antico
241
Q [Miguel,ama,a,todo,hombre,que,ama,a,Miguel| B]\ B
Amigo de sus amigos, como debe ser. Veamos que mas nos dice
el programa:
Q [Miguel,ama,a,todo,hombre,que,ama,a,Adriana| B]\ B
vive| C]\ C
242
An
alisis del Lenguaje Natural
Referencias
[1] Aho, A. V. and Ullman, J. D.
The Theory of Parsing, Translation and Compiling.
1973. Prentice-Hall, Englewood Cliffs, vol. 1,2, New Jersey,
U.S.A.
[2] Bancilchon, F.; Maier, D.; Sagiv, Y.; and Ullman,
J. D.
Magic Sets: Algorithms and Examples.
1985. MCC Technical Report DB-168-85.
[3] Beeri, C.; and Ramakristan, R.
On the Power of Magic.
1987. Proc. of the 6th ACM SIGACT-SIGMOD-SIGART
Syposium on Principles of Database Systems (pp. 269-283),
San Diego, California, USA.
[4] Bird, R. S.
Tabulation Techniques for Recursive Programs.
1980. Computing Survey, vol. 12, no 4 (pp.403-417).
[5] Colmerauer, A.
Metamorphosis Grammars.
1978. Natural Language Communication with Computers,
L. Bolc ed., Springer LNCS 63.
[6] Dietrich, S. W.
Extension Tables: Memo Relations in Logic Programming.
1987. Proc. of the 4th Symposium on Logic Programming
(pp. 264-272), San Francisco, California, USA.
243
244
Referencias
Referencias
245
[15] Lang, B.
Complete Evaluation of Horn Clauses, an Automata
Theoretic Approach.
1988. Research Report no 913, INRIA Rocquencourt,
France.
[16] Lang, B.
Towards a Uniform Formal Framework for Parsing.
1991. Current Issues in Parsing Technology, M. Tomita ed.,
Kluwer Academic Publishers (pp. 153-171).
[17] Lloyd, J. W.
Foundations of Logic Programming.
1987. Springer-Verlag, 2nd edition.
[18] Maier, D. and Warren, D. S.
Computing with Logic
1988. The Benjamin/Cummings Publishing Company Inc.,
Menlo Park, California, U.S.A.
[19] Naish, L.
MU-Prolog 3.2. Reference Manual
1990. Technical Report 85/11. Dept. of Computer
Sciences, University of Melbourne, Parkville, Victoria 3052,
Australia.
[20] Pereira, F. C. N. and Warren, D. H. D.
Definite Clause Grammars for Language Analysis. A Survey
of the Formalism and a Comparison with Augmented
Transition Networks.
1980. Artificial Intelligence, vol.13 (pp. 231-278).
[21] Pereira, F. C. N. and Warren, D. H. D.
Parsing as Deduction.
1983. Proc. of the 21st Annual Metting of the Association
for Computational Linguistics, Cambridge, Massachusetts,
U.S.A (pp. 137-144).
246
Referencias
[22] Robinson, J. A.
A Machine-Oriented Logic Based on the Resolution
Principle
1965. Journal of the ACM, vol. 12.
[23] Tamaki, H. and Sato, T.
OLD Resolution with Tabulation.
1986. Proc. of the 3rd International Conference on Logic
Programming, London, United Kingdom, Springer LNCS
225 (pp. 84-98).
[24] Van Emdem, M. H., and Lloyd, J. W.
A Logical Reconstruction of Prolog II
1990. The Journal of Logic Programming, vol. 1, no 2.
[25] Vieille, L.
Database-Complete Proof Procedures Based on SLD
Resolution.
1987. Proc. of the 4th International Conference on Logic
Programming, Melbourne, Australy.
[26] Villemonte de la Clergerie, E.
Automates a
` Piles et Programmation Dynamique.
1993. Doctoral Thesis, University of Paris VII, France.
[27] Vilares Ferro, M.
Efficient Incremental Parsing for Context-Free Languages.
1992. Doctoral thesis, University of Nice, France.
Indice
is, 184
nonvar, 195
number, 195
retract, 186
var, 195
cand, 46
cor, 46
fail, 121, 127
freeze, 139
not, 130
op, 174
=, 26
, 26
, 49
, 48
, 26
regla, 7, 216
, 26
, 26
N , 50
,, 83
., 83
:, 4850, 237
:-, 83
;, 95
&, 237
arbol
de derivacion, 13, 15,
199
de resolucion, 67, 91
Prolog, 92
sintactico, 14
atomo, 83
asserta, 186
assert, 186
atomic, 195
atom, 195
float, 195
integer, 195
acumulador, 165
ambig
uedad
lexica, 223
semantica, 223
sintactica, 8, 213, 223
analisis
ascendente, 12, 20
descendente, 15, 16, 20,
94
lexico, 11, 227
predictivo, 15
sintactico, 3, 20, 207,
229
analizador
ascendente, 17, 18
descendente, 12, 15, 18
247
INDICE
248
lexico, 11
sintactico, 11, 12
de los palndromos,
209
de los parentesis, 212
del espa
nol, 223
aplanamiento de listas, 157,
167, 175
argumento de un funtor, 81
aridad de un funtor, 81
axioma, 41
celula, 147
calculo
de predicados, 44, 50,
54, 61
de proposiciones, 25, 35,
38
cabeza de una clausula, 66,
83
cadena vaca, 5
car, 148
categora
lexica, 4
sintactica, 4
cdr, 148
clausula, 64, 83
de Horn, 83
comentario, 195
completud, 100
concatenacion de listas, 155
conflicto
desplazamiento/reduccion,
19
reduccion/reduccion, 19
congruencia
declarativo/operacional,
100
conjuncion, 26
condicional, 46
constante logica, 82
contraejemplo, 67
control de la resolucion, 111
correccion, 100
corte, 111
rojo, 123
verde, 123
cuantificador
existencial, 49
numerico, 50
universal, 48
cuerpo de una clausula, 83
declaracion no logica, 174
derivacion, 5
canonica, 8
directa, 5
indirecta, 5
por la derecha, 8, 12
por la izquierda, 8, 12
desplazamiento, 19
diferencia
de estructuras, 178
de listas, 172
de sumas, 179
disyuncion, 26
condicional, 46
doblete, 147
duplicacion de listas, 159
entrada, 185
INDICE
equivalencia
de cuantificadores, 51
logica, 35
estado, 29, 44
estructura
de
datos
incompleta, 172, 178
evaluacion
de predicados, 45
de proposiciones, 27
perezosa, 139
evaluacion
aritmetica, 184
exploracion en profundidad,
15, 94, 213
exponenciacion de n
umeros
naturales, 117
expresion
aritmetica, 184
atomica, 44
normalizada
por la derecha, 181
por la izquierda, 179
249
ambigua, 8, 13
aritmetica, 4
aumentada, 11, 215
de contexto libre, 6, 224
de las proposiciones, 27,
32
de los palndromos, 208
de los parentesis, 212,
219
no ambigua, 9
reducida, 10
del espa
nol, 224
sensible al contexto, 209,
223, 229
hecho, 65
factorial de un n
umero, 168
firma de un funtor, 82, 209
forma
normal
de Chomsky, 216
de Greibach, 13, 215,
219
sentencial, 6
frontera de un arbol, 14, 15
funcion, 82
de Fibonacci, 187
funtor principal, 81
identificador
acotado, 54
libre, 54
ligado, 54
igualdad, 26
implicacion, 26
inclusion de conjuntos, 162
inconsistencia, 70
logica, 66
inferior, 128
o igual, 127
instanciacion, 85
interprete
logico, 92
Prolog, 89, 92
interseccion de conjuntos,
162
inversion de listas, 156
gramatica, 3
logica
250
de predicados
de primer orden, 43
de proposiciones, 26, 43
lema de una palabra, 231,
233
lenguaje
ambiguo, 8
de contexto libre, 207
generado
por
una
gramatica, 7
natural, 207
lexema de una palabra, 231
ley
de la contradiccion, 36,
47
de la identidad, 37
de la igualdad, 37
de la implicacion, 37
de la negacion, 36
del medio excluido, 36,
47
leyes
asociativas, 36, 47
conmutativas, 36
de De Morgan, 36, 47
de equivalencia, 36
de la simplificacion del
, 37
de la simplificacion del
, 37
de la simplificacion del
cand, 48
de la simplificacion del
cor, 48
distributivas, 36, 47
LIFO, 87
INDICE
lista, 147
vaca, 148
literal, 83
longitud de una lista, 159
metodo
de resolucion SLD, 89
de unificacion
de Robinson, 87
mgu, 86
multiplicacion de n
umeros
naturales, 113
n
umero
natural, 84, 93
impar, 98
par, 97
negacion, 26, 83, 121, 127,
130
por fallo, 130, 135
nombre de un funtor, 81
objetivo, 67, 91
operador, 20, 21, 174, 197,
198
binario, 199
logico, 26, 31, 46
Prolog, 197
unario, 200
palndromo, 208
paradigma declarativo, 104
pertenencia a una lista, 151
predicado, 25, 45, 83
aritmetico, 183
de memorizacion, 186
metalogico, 194
INDICE
251
de una gramatica, 5
in
util, 10, 216
inaccesible, 9
inicial, 4, 6, 7
no terminal, 3
terminal, 4
variable, 4
salida, 185
semantica
declarativa, 83, 85
operacional, 83, 85
sentencia, 6, 208, 216, 224
significado, 100
declarativo, 64
deseado, 100
SLD, 89
suma de n
umeros naturales,
98
sustitucion, 85
simultanea, 59
textual, 56
termino, 81
compuesto, 81
simple, 81
tabla de verdad, 27
tautologa, 34
teorema, 41
test
de ciclicidad, 88
metalogico, 195
tipo, 44
conjunto, 160
registro, 82
torres de Hanoi, 190
252
transformacion
de
implicaciones, 40
union de conjuntos, 161
unificacion, 62, 82, 86
unificador, 86
mas general, 86
valor indefinido, 46
variable, 81
anonima, 124
INDICE