Está en la página 1de 71

Departamento de Informtica

Universidad Tcnica Federico Santa Mara


1
Lenguajes de Programacin
Captulo V:
Programacin Lgica
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
2
Lenguajes de Programacin
5.1 Breve Introduccin al Clculo
de Predicados
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-3
Lenguajes de Programacin
Definiciones Bsicas
Proposicin: sentencia lgica que puede ser
verdadera o falsa.
Se construye de objetos y relaciones.
Lgica formal provee mtodos para verificar su validez
Lgica Simblica: permite expresar
proposiciones, relaciones entre proposiciones y
cmo inferir nuevas proposiciones que son
verdaderas.
Clculo de Predicado: Forma particular de lgica
simblica usada en programacin lgica.
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-4
Lenguajes de Programacin
Objetos y Trminos Compuestos
Objetos se representan como un nico trmino,
que puede ser:
constante : representa un nico objeto
variable : puede representar diferentes objetos
Trmino compuesto: consiste de functor y una
lista de parmetros
Un trmino con n parmetros se denomina n-tupla.
El trmino padre(maria, jess) es una 2-tupla.
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-5
Lenguajes de Programacin
Proposiciones
Proposiciones pueden ser:
Atmicas: corresponde a un nico trmino compuesto
Compuestas: dos o ms proposiciones atmicas
conectadas por operadores lgicos.
Una proposiciones puede ser:
Hecho: se define como una verdad (axioma)
Consulta: la verdad debe ser probada (teorema)


Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-6
Lenguajes de Programacin
Proceso de Resolucin
Presencia de variables requiere de un proceso de
calce (matching) que al reemplazar sus valores
produce una verdad (xito).
Este proceso se denomina unificacin.
Asignacin temporal de valores a variables se
denomina instanciacin.
Fallas (no xito) en la instanciacin requiere de
backtracking.

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-7
Lenguajes de Programacin
Clusulas de Horn
Clusulas de Horn simplifican el proceso de
resolucin, y permiten representar la mayora de
las proposiciones lgicas.
Slo permite dos tipos de formas:
Existe slo una proposicin atmica en la izquierda de
la clusula (clusula con cabeza)
El lado izquierdo est vaco (clusula sin cabeza)
Clusulas con cabeza se usan para definir reglas,
en cambio clusulas sin cabezas slo establecen
ciertos hechos.
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-8
Lenguajes de Programacin
Significado
Declarativo versus Procedural
La clusula:

P <= Q, R.

Se interpreta declarativamente como:

p es verdadero si Q y R lo son.
De Q y R se deriva P.

En cambio una interpretacin procedural sera:

Para resolver P, primero se debe resolver Q y luego R.
Para satisfacer a P, primero se debe satisfacer Q y luego R.
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-9
Lenguajes de Programacin
Conclusiones
Programacin Lgica consiste bsicamente
en definir un conjunto de reglas y hechos
(hiptesis).
El sistema luego debe ser capaz de inferir si
una determinada proposicin (meta) es una
verdad.
Prolog est basado en el uso de clusulas de
Horn.
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
10
Lenguajes de Programacin
5.2 Introduccin a Prolog
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-11
Lenguajes de Programacin
Caractersticas de Prolog
Basado en Lgica y programacin declarativa
Produce estilo de programacin orientado a metas
No se especifica cmo debe hacerse, sino qu
debe lograrse (alto nivel)
El programador se concentra ms en el
conocimiento que en los algoritmos
Qu es conocido? (hechos y relaciones )
Qu preguntar? (cmo resolverlo)

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-12
Lenguajes de Programacin
Hechos en Prolog: Ejemplo
padre(maria, pedro).
padre(juan, pedro).
padre(juan, carola).
padre(pedro, ana).
padre(pedro, paty).
padre(paty, aldo).

ana
maria juan
pedro carola
paty
aldo
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-13
Lenguajes de Programacin
Consultas en Prolog
?- padre(pedro, ana).
=> yes

?- padre(ana, paty).
=> no

?- padre(X, carola).
=> X = juan

?- padre(pedro, X).
=> X = ana ;
=> X = paty ;
=> no

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-14
Lenguajes de Programacin
Consulta: Ejemplo 1
Preguntar por el abuelo de aldo:

X, Y : (X es padre de Y) (Y es padre de aldo)

que se expresa en Prolog como:

?- padre(X, Y), padre(Y, aldo).
=> X = pedro
Y = paty


Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-15
Lenguajes de Programacin
Consulta: Ejemplo 2
Preguntar por los nietos de juan:

X, Y : (juan es padre de X) (X es padre de Y)

que se expresa en Prolog como:

?- padre(juan, X), padre(X, Y).
=> X = pedro
Y = ana ;

=> X = pedro
Y = paty

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-16
Lenguajes de Programacin
Consulta: Ejemplo 3
Preguntar si ana y paty tienen un padre en comn:

X : (X es padre de ana) (X es padre de patricio)

que se expresa en Prolog como:

?- padre(X, ana), padre(X, paty).
=> X = pedro

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-17
Lenguajes de Programacin
Otros Hechos
Agregar clusulas sobre el sexo de las personas
(relaciones unarias):

femenino(maria).
masculino(juan).
masculino(pedro).
femenino(carola).
femenino(ana).
femenino(paty).
masculino(aldo).


Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-18
Lenguajes de Programacin
Alternativa de definicin de
hechos
Podra haberse definido tambin con una relacin binaria:

sexo(maria, femenino).
sexo(juan, masculino).
sexo(pedro, masculino).
sexo(carola, femenino).
sexo(ana, femenino).
sexo(paty, femenino).
sexo(aldo, masculino).

A continuacin usaremos la forma unaria!

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-19
Lenguajes de Programacin
Reglas en Prolog
La relacin:
a b
se expresa en Prolog como:
a :- b.
Una clusula de este tipo se denomina regla, que
tiene la siguiente estructura:
la cabeza (parte izquierda de :- ) es la conclusin
la proposicin definida en el cuerpo (parte derecha de :- )
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-20
Lenguajes de Programacin
Resolucin Simple
La relacin hijo de corresponde a:
X, Y : (Y es hijo de X) (X es padre de Y)
que se expresa en Prolog como:
hijo(X, Y) :- padre(Y, X).

Ejemplo: la meta siguiente es evaluada como:
La meta: hijo(paty, pedro)
se convierte en submeta padre(pedro, paty)
Se busca este hecho: yes
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-21
Lenguajes de Programacin
Ejemplo de Reglas
Se puede definir ahora varias nuevas reglas como:

papa(X, Y) :- padre(X, Y), masculino(X).
mama(X, Y) :- padre(X, Y), femenino(X).
abuelo(X, Y) :- padre(X, Z), padre(Z, Y).
hermana(X, Y) :- padre(Z, X), padre(Z, Y), femenino(X).

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-22
Lenguajes de Programacin
Ejemplo de Consulta
?- hermana(ana, paty).
=> yes

?- hermana(X, paty).
=> X = ana ;
=> X = paty
oops ... paty es hermana de ella misma
Falta excluir este caso:

hermana(X, Y) :- diferente(X, Y), padre(Z, X),
padre(Z, Y), femenino(X).
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-23
Lenguajes de Programacin
Resumiendo...
Programas Prolog se extienden simplemente agregando ms clusulas
Clusulas son de tres tipos: hechos, reglas y consultas
Reglas declaran cosas que cuya verdad depende de otras condiciones
Por medio de consultas el usuario puede solicitar al programas que
establezca qu cosas son verdad
Una clusula tiene una cabeza y un cuerpo. El cuerpo son metas
separadas por comas (conjuncin)
Hechos son clusulas que no tienen cuerpo
Preguntas slo tienen cuerpo
Reglas tienen cabeza y cuerpo
Una evaluacin puede sustituir una variable X por otro objeto (se dice
que X se instancia)
Variables se cuantifican universalmente ()

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-24
Lenguajes de Programacin
Reglas Recursivas
La relacin antepasado se define sobre la base de una
regla de descendencia directa y otra regla de descendencia indirecta:

X, Z : (X es un antepasado de Z), si
{X es padre de Z }
{ Y: (X es padre de Y) (Y es antepasado de Z) }

Lo que en Prolog se expresa como :

antepasado(X, Z) :- padre(X, Z). % descendiente directo
antepasado(X, Z) :- padre(X, Y), antepasado(Y, Z). % descendiente ind.

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-25
Lenguajes de Programacin
Ejemplo de Consulta
% Consultar por los descendientes de maria

?- antepasado (maria, X)
=> X = pedro ;
=> X = ana ;
=> X = paty ;
=> X = aldo

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-26
Lenguajes de Programacin
Resolucin de Consulta
antepasado(juan, paty)
NO
SI
padre(juan, paty)
Regla#1
padre(juan, X)
antepasado(X, paty)
Regla#2
antepasado(pedro, paty)
Hecho:
padre(juan, pedro)
X=pedro
padre(pedro, paty)
Regla#1
ana
maria juan
pedro carola
paty
aldo
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
27
Lenguajes de Programacin
5.3 Tipos de Datos en Prolog
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-28
Lenguajes de Programacin
Objetos de Datos en Prolog
Objetos de datos simples
Objetos estructurados
Calce de operaciones fundamentales sobre
objetos
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-29
Lenguajes de Programacin
Reconocimiento de Tipos
Se reconoce el tipo de un dato por su forma
sintctica; no se requiere de declaracin de
tipos
Ejemplo:
Variables se definen comienzan con primera en
maysculas (e.g. X)
Atomos comienzan con una letra en minscula
(e.g. pedro)
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-30
Lenguajes de Programacin
Atomos
1) Strings de letras, dgitos y underscore (_),
comenzando con minscula
pedro nil x_25 algo_especial
2) Strings de caracteres especiales
<----> ===> ...
3) Strings con citacin simple
Juan San Francisco

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-31
Lenguajes de Programacin
Variables
Strings de letras, dgitos y underscore,
comenzando con mayscula o underscore.
X Resultado _X1 _12
Si una variable aparece una solo vez en una
clusula, se puede usar variables annima _
?- padre(juan, _).
yes % no se imprime variable
tiene_hijo(X) :- padre(X, _).
mbito de variable es una clusula
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-32
Lenguajes de Programacin
Ejemplo con Figuras Geomtrica
2 4 6 8
2
4
6
P2 = (2,3)
P1 = (1,1)
(6,4)
(7,1)
(4,2)
T S
P1 = punto(1, 1)
P2 = punto(2,3)
S = seg(P1, P2)
T = triangulo (punto(4,2),
punto(6,4), punto(7,1))
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
33
Lenguajes de Programacin
5.4 Calce de Trminos en Prolog
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-34
Lenguajes de Programacin
Concepto de Calce
La operacin ms importante sobre
trminos es el calce, que corresponde a la
unificacin en el clculo de predicados.
Dos trminos calzan si:
Son idnticos
Las variables en ambos trminos pueden ser
instanciados, sustituyendo variables, tal que los
trminos se hacen idnticos.

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-35
Lenguajes de Programacin
Ejemplo de Calce
Calzar: fecha(D, M, 2000) y
fecha(D1, mayo, A1) , entonces:
D se instancia a D1
M se instancia a mayo
A1 se instancia a 2000
Que como salida de Prolog se escribe:
D = D1
M= mayo
A1 = 2000
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-36
Lenguajes de Programacin
Ejemplo de Calce
Calzar: fecha(D, M, 2000) y
fecha(D1, julio, 1956) , entonces:

No es posible encontrar un calce (se dice que el
proceso de calce ha fracasado).
En caso contrario, se dice que el proceso ha sido
exitoso.

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-37
Lenguajes de Programacin
Ejemplo de Calce en Prolog
?- fecha(D, M, 2000) = fecha(D1, mayo, A1).
D = H86
M = mayo
D1 = H86
A1 = 2000

?- fecha(D, M, 2000) = fecha(D1, julio, 1956).
no

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-38
Lenguajes de Programacin
Reglas de Calce
Dos trminos S y T calzan, si:
Si S y T son constantes, entonces S y T calzan si ambos
son el mismo objeto.
Si S es una variable y T cualquier cosa, entonces calzan y
S se instancia como T. Viceversa, si T es variable,
entonces T se instancia como S.
Si S y T son estructuras, entonces calzan slo si:
S y T tienen el mismo functor, y
Todas sus correspondientes componentes calzan.
Instanciaciones resultantes es determinado por proceso de calce de
componentes.
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-39
Lenguajes de Programacin
Grado de Ajuste del Calce
?- fecha(D, M, 2000) = fecha(D1, mayo, A1).

Podra haber sido calzado como:
D = 1
D1 = 1
M = mayo
A1 = 2000
Pero esta forma es ms restrictiva (menos general)
que la anterior.

Prolog calza el resultado a su forma ms general!

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-40
Lenguajes de Programacin
Ejemplo de Calce de Estructuras
triangulo
punto punto A
1 1 2 3
triangulo
punto punto X
4 Y 2 Z
?- triangulo(punto(1, 1), A, punto(2, 3)) =
triangulo(X, punto(4, Y), punto(2, Z)).
A = punto(4,H193)
X = punto(1,1)
Y = H193
Z = 3
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-41
Lenguajes de Programacin
Ejemplo de Calce con Estructuras
?- vertical(seg(punto(1,1), punto(1,2))).
yes

?- vertical(seg(punto(1,1), punto(2,Y))).
no

?- horizontal(seg(punto(1,1), punto(2,Y))).
Y = 1

?- vertical(seg(punto(2,3), Y)).
Y = punto(2,H561)

?- vertical(S), horizontal(S).
S = seg(punto(H576,H577),punto(H576,H577))
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-42
Lenguajes de Programacin
Disjuncin en Clusulas
La clusula:

P :- Q; R.

Se puede interpretar como:

P :- Q.
P :- R.

La clusula:

P :- Q, R;
S, T, U.

Se puede interpretar como:

P :- Q, R.
P :- S, T, U.

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
43
Lenguajes de Programacin
5.5 Listas y Operadores
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-44
Lenguajes de Programacin
Listas en Prolog
Una lista en Prolog se puede escribir como:
[perro, gato, ratn, loro]
Sin embargo esto es slo un sabor sintctico,
pues Prolog lo traduce una forma de estructura.
Si existe la estructura .(Cabeza, Cola), entonces:
.(perro, .(gato, .(ratn, .(loro, []))))
equivale a la lista anterior (que es ms legible)
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-45
Lenguajes de Programacin
Representacin de Listas
Una lista define un rbol binario, similar a las
listas propias de Scheme.
Prolog permite una notacin similar a los pares:
L = [a | Cola] , donde a es la cabeza (cualquier tipo) y
Cola es el resto de la lista (debe ser una lista) .
La lista vaca se expresa como [].
Ejemplo:
?- L2 = [ a | [b | []]].
L2 = [a,b]

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-46
Lenguajes de Programacin
Algunos Posibles Operadores
sobre Listas
Membresa del objeto X en la lista L:
member(X, L)
Concatenacin de listas L1 y L2 en L3
conc(L1, L2, L3)
Agregar un elemento X en una lista L
add(X, L, L1)
Borrar un elemento X en una lista L
del(X, L, L1)

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-47
Lenguajes de Programacin
Definicin de Operadores (1/2)
%definicion de membresia de X en una lista L: member(X, L).
% ============================================

member(X, [X | Cola]).
member(X, [Cabeza | Cola]) :- member(X, Cola).

% concatenacion de listas L1 y L2 en lista L3: conc(L1, L2, L3).
% ==============================================

% concat. con lista vacia es la misma lista
conc([], L, L).

% caso de que primera lista no est vaca
conc([X | L1], L2, [X | L3]) :- conc(L1, L2, L3).
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-48
Lenguajes de Programacin
Ejemplos de Operadores con
Listas
?- member(X, [a, b]).
X = a ;
X = b ;
no

?- conc([a], [b], L).
L = [a,b] ;
no


?- add(a, X, Y).
X = H918
Y = [a | H918] ;
no

?- del(b, [a, b, c, b, d], L).
L = [a,c,b,d] ;
L = [a,b,c,d] ;
no

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-49
Lenguajes de Programacin
Sublistas
Una sublista es una parte de una lista
El operador puede ser definido con la
siguiente regla:

Ejemplo:
?- sublist([b, X], [a, b, c, d]).
X = c

sublist(S, L) :- conc(L1, L2, L), conc(S, L3, L2).
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
50
Lenguajes de Programacin
5.6 Operadores y Aritmtica
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-51
Lenguajes de Programacin
Notacin de Operadores
Las operaciones en Prolog se expresan
normalmente como functores.
Se permite tambin especificar operadores
especiales con su relacin de precedencia
mediante directivas al traductor Prolog.
Este mecanismo permite mejorar la lectura
de programas (sabor sintctico), similar a la
sobrecarga de operadores en C++
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-52
Lenguajes de Programacin
Ejemplo de Operadores
La expresin:

+(*(2, a), *(b, c))

podra escribirse como:

2*a + b*c

Que resulta ms legible!!

Ejemplo en Prolog:

?- X = +(*(2, 3), *(4, 5)).
X = 2 * 3 + 4 * 5

?- X is +(*(2, 3), *(4, 5)).
X = 26 .

?- X is 2*3 + 4*5.
X = 26

Se ha supuesto que + tiene mayor precedencia que *
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-53
Lenguajes de Programacin
Ejemplo:
Mximo Comn Divisor
mcd(X, X, X).

mcd(X, Y, D) :-
X<Y,
Y1 is Y-X,
mcd(X, Y1, D).

mcd(X, Y, D) :-
Y<X,
mcd(Y, X, D).
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-54
Lenguajes de Programacin
Ejemplo:
Mximo Comn Divisor
?- mcd(100, 10, X).

X = 10

?- mcd(27, 36, X).

X = 9

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
55
Lenguajes de Programacin
5.7 Ejemplos de Programas
con Estructuras
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
56
Lenguajes de Programacin
Ejemplo de Programa
Problema de las Ocho Reinas
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-57
Lenguajes de Programacin
Problema de las Ocho Reinas
1
2
3
4
5
6
7
8
1 2 3 4 5 6 7 8








Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-58
Lenguajes de Programacin
Solucin #1 en Prolog
solucion1([]).
solucion1([X/Y | Otras]) :- % primera reina en X/Y
solucion1(Otras),
member(Y, [1,2,3,4,5,6,7,8]),
noataque(X/Y, Otras). % Primera reina no ataca a otras

noataque(_, []).
noataque(X/Y, [X1/Y1 | Otras]) :-
Y =\= Y1, % diferentes filas
Y1 - Y =\= X1 - X, % diferentes diagonales
Y1 - Y =\= X - X1,
noataque(X/Y, Otras). % Primera reina no ataca a otras

plantilla([1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y8]).

solucion(S) :- plantilla(S), solucion1(S).

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-59
Lenguajes de Programacin
Consulta a la Solucin #1
?- solucion(S).

S = [1 / 4,2 / 2,3 / 7,4 / 3,5 / 6,6 / 8,7 / 5,8 / 1] ;

S = [1 / 5,2 / 2,3 / 4,4 / 7,5 / 3,6 / 8,7 / 6,8 / 1] ;

S = [1 / 3,2 / 5,3 / 2,4 / 8,5 / 6,6 / 4,7 / 7,8 / 1]


Departamento de Informtica
Universidad Tcnica Federico Santa Mara
60
Lenguajes de Programacin
5.8 Control de Backtracking
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-61
Lenguajes de Programacin
Porqu controlar Backtracking?
Prolog realiza backtracking automtico si
falla la satisfaccin de una clusula
Sin embargo, en algunos casos el
backtracking automtico es ineficiente
El programador puede controlar o prevenir
el backtracking usando cut.
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-62
Lenguajes de Programacin
Ejemplo de una Funcin
Suponga las siguientes tres reglas para una
funcin de doble escaln:
Regla#1: Si (X<3) entonces Y=0
Regla#2: Si (3 X) y (X<6), entonces Y=2
Regla#3: Si (6X), entonces Y =4
3
6
2
4
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-63
Lenguajes de Programacin
Funcin Expresada en Prolog
f(X, 0) :- X<3. % regla #1

f(X, 2) :- 3 =< X, X < 6. % regla #2

f(X, 4) :- 6 =< X. % regla #3

% La consulta siguiente

-? f(1, Y), 2<Y.

no

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-64
Lenguajes de Programacin
Evaluacin de la Meta
f(1, Y)
2<Y
1<3
2<0
2<0
NO!
Regla#1
Y=0
31
1<6
2 < 2
Regla#2
Y=2
NO!
Regla#3
Y=4
NO!
61
2<4
CUT
Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-65
Lenguajes de Programacin
Funcin Expresada en Prolog
usando CUT
f(X, 0) :- X<3, !. % regla #1

f(X, 2) :- 3 =< X, X < 6, !. % regla #2

f(X, 4) :- 6 =< X. % regla #3


-? f(1, Y), 2<Y.

no

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-66
Lenguajes de Programacin
Optimizando Evaluacin de
Funcin usando CUT
f(X, 0) :- X<3, !. % regla #1

f(X, 2) :- X < 6, !. % regla #2

f(X, 4) . % regla #3



-? f(7, Y).

Y=4

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-67
Lenguajes de Programacin
Negacin como Falla
A Mara le gustan los animales:
gusta(maria, X) :- animal(X).
Pero no le gustan las serpientes!!
Expresado en Prolog:

gusta(maria, X) :- serpiente(X), !, fail
;
animal(X).

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-68
Lenguajes de Programacin
Ejemplos de Negacin
La verificacin si dos expresiones difieren:

diferente(X, Y) :- X = Y, !, fail
;
true.

El procedimiento interno not de Prolog se comporta
como:

not(P) :- P, !, fail
;
true.


Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-69
Lenguajes de Programacin
Aplicacin de la Negacin
La funcin diferente ahora se puede escribir como:

diferente(X, Y) :- not(X =Y).

Y la regla de Maria:

gusta(maria, X) :-
not(X = serpiente),
animal(X).


Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-70
Lenguajes de Programacin
Problema de las 8 Reinas
Expresada con Negacin
solucion1([]).

solucion1([X/Y | Otras]) :- % primera reina en X/Y
solucion1(Otras),
member(Y, [1,2,3,4,5,6,7,8]),
not ataque(X/Y, Otras). % Primera reina no ataca a otras

ataque(X/Y, Otras) :-
member(X1/Y1, Otras),
(Y = Y1; % en la misma filas,
Y1 is Y + X1 - X; % en la mismas diagonales
Y1 is Y + X - X1).

plantilla([1/Y1, 2/Y2, 3/Y3, 4/Y4, 5/Y5, 6/Y6, 7/Y7, 8/Y8]).

solucion(S) :- plantilla(S), solucion1(S).

Departamento de Informtica
Universidad Tcnica Federico Santa Mara
V-1-71
Lenguajes de Programacin
Uso de Cut y Negacin
Ventajas
Se puede aumentar la eficiencia
Se pueden expresar reglas que son mutuamente
exluyentes
Desventajas
Se pierde correspondencia entre significado
declarativo y procedural
Cambio del orden de las clusulas puede afectar
significado declarativo

También podría gustarte