Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Meta-cláusulas
Meta-Predicados
1
Manipulación de la base de datos
Ejemplo:
7
Ejemplos:
8
Las bases de datos deductivas usan estas ideas para
desarrollar bases de datos basadas en la lógica
•a menudo se usa un subconjunto de los programas
lógicos
•se suele utilizar alguna variante del mecanismo
“bottom-up” como estrategia de ejecución.
9
asserta(X)
assertz(X)
retract(X)
11
¿Es posible definir variables globales en Prolog?
Ejemplo adaptado del tutorial de Amzi Prolog
rápido(ana). A = juan
lento(juan). B = ana ;
más_lento(X,Y):-
lento(X), No
rápido(Y).
13
?- assert((rápido(patricia))).
Yes
?- listing(rápido).
rápido(ana).
rápido(patricia).
Yes
?- más_lento(A,B).
A = juan
B = ana ;
A = juan
B = patricia ;
No
14
?- más_rápido(A,B).
A = ana
B = juan ;
A = patricia
B = juan ;
?- assert( No
| (más_rápido(X,Y):-
| rápido(X),lento(Y))).
?- listing(más_rápido).
más_rápido(A, B) :-
rápido(A),
lento(B).
Yes 15
?- listing(rápido).
rápido(patricia).
Yes
?- más_rápido(A,B).
A = patricia
B = juan ;
?- listing(rápido). No
rápido(ana).
rápido(patricia).
Yes
?- retract(rápido(ana)).
Yes
16
?- más_rápido(A,B).
A = patricia
B = juan ;
A = patricia
B = tomás ;
?- assertz(lento(tomás)). No
Yes
?- listing(lento).
lento(juan).
lento(tomás).
Yes
17
?- más_rápido(A,B).
No
?- retractall(lento(X)).
Yes
?- listing(lento).
Yes
18
?- más_lento(A,B).
[WARNING: Undefined predicate:
`más_lento/2']
No
?- retract(
| (más_lento(X,Y):-
| lento(X), rápido(Y))).
X = _G339
Y = _G340
Yes
19
Otros predicados para manipulación de la base
de datos (SWI-Prolog)
retract/assert:
modificar la base de datos de cláusulas.
compilan el término que se les pasa como argumento.
son costosas.
recorda/erase:
permiten grabar/borrar una base de datos de
términos.
mecanismo más rápido que assert/retract, pero
no son cláusulas del programa
20
Construcción y descomposición de términos
Term =.. L
functor(Term, F, N)
arg(N, Term, A)
21
?- f(a,b) =.. L.
L = [f, a, b]
22
Ejemplo:
cuadrado(Lado)
triángulo(Lado1, Lado2, Lado3)
círculo(Radio)
23
Ejemplo: (Cont.)
Una posibilidad:
aumenta(rectángulo(A,B), F, rectángulo(A1,B1)) :-
A1 is A*F, B1 is B*F.
...
24
Ejemplo: (Cont.)
aumenta(Tipo(Par), F, Tipo(Par1)) :-
Par1 is Par*F.
25
Ejemplo: (Cont.)
La solución:
aumenta(Fig, F, Fig1) :-
Fig =.. [Tipo | Parámetros],
multiplica_lista(Parámetros, F, Parámetros1),
Fig1 =.. [Tipo | Parámetros1].
26
Ejemplo:
27
Ejemplo:
28
Ejemplo:
29
?- 2*sen(x)*f(sen(x))
?- sustituye(mi, =.. [F |tu,
[mi,perro, [en,mi,casa]], Args].
F).
F = [tu, perro,F[en,
= * tu, casa]]
Ejemplo: Yes Args = [2*sen(x), f(sen(x))]
R isf OPs :-
(
OPs =.. [F, A, C/D], integer(A) -> OPs1 =.. [F, A/1,C/D]
;
OPs =.. [F, A/B, C], integer(C) -> OPs1 =.. [F, A/B,C/1]
),
!,
R isf OPs1.
R isf OPs :-
OPs =.. [_, A, B],
integer(A),
integer(B),
!,
R is OPs.
R isf OPs:-
OPs =..[F,A,B],
R1 isf A,
R2 isf B,
OPs1 =..[F,R1,R2],
R isf OPs1. 32
Un uso habitual de =.. es el de sintetizar nuevos
objetivos:
obtener(Functor),
calcular(ArgList),
Objetivo =.. [Functor | ArgList]
Objetivo
call(Objetivo)
33
Otras veces nos interesará extraer el functor
principal de un término
functor(Term, F, N)
es cierto si F es el functor principal de Term
y N es la aridad de F
arg(N, Term, A)
es cierto si A es el N-ésimo argumento de Term
cuando los argumentos se numeran de izda a dcha
empezando por 1.
34
Ejemplo:
35
Cómo cambiar un argumento (I)
36
Cómo cambiar un argumento (II)
Otra:
38
Las diferentes soluciones ?- bagof(Verdura,
bagof(X, P,por
agrupadas L) el valor de | item(Verdura,Precio),
item(Verdura,Precio),L).
L).
Precio
Produce la lista L de todos
Verdura los=objetos
_G315 X
que satisfacen el objetivo
PrecioP.=Normalmente
300
X es una variable en P.L = [coliflor] ;
Verdura = _G315
item(tomates, 120). Precio = 275
item(coliflor, 300). L = [pimiento] ;
item(pimiento, 275). Verdura = _G315
item(lechuga, 115). Precio = 115
L = [lechuga] ;
item(cebolla, 120).
Verdura = _G315
?- bagof(Verdura,
Precio item(Verdura,120),
= 120 L).
?- bagof(Precio,Verdura
bagof(Verdura,Verdura
bagof(Verdura, Precio^=^item(Verdura,50),L).
item(Verdura,Precio),
item(Verdura,
item(Verdura,115),
_G297 L). Precio),
L).
L).
L = [tomates, cebolla] ;
Precio
Verdura= =_G352
_G351L = [tomates, cebolla]
Verdura
No
Precio = =_G352
_G351Yes
No
L = [120,
[tomates,
300,coliflor,
275, 115,pimiento,
120] lechuga, cebolla]
39
?- setof(Precio,Verdura ^ item(Verdura,Precio), L).
setof(X, = P, L)
?- setof(Verdura,Precio
Precio _G352 ^ item(Verdura,Precio), L).
Verdura == _G351
Verdura _G351
LPrecioProduce
= _G352
= [115, la lista
120, 275, 300]L de todos los objetos X
(nóteseque
la satisfacen
L = [cebolla, el
deobjetivo
coliflor, lechuga,
eliminación P. Normalmente
pimiento,
duplicados y latomates]
ordenación de
menor Xa es
(nótese la una variable
ordenación
mayor) en P.
alfabética)
item(tomates, 120).
item(coliflor, 300).
item(pimiento, 275).
item(lechuga, 115).
item(cebolla, 120).
40
findall(X,
?- P, L)
?- findall(Verdura,item(Verdura,50),L).
findall(Verdura,item(Verdura,_),L).
Verdura
Verdura == _G279
_G273
] Producecoliflor,
LL == [[tomates, la listapimiento,
L de todos los objetos
lechuga, X
cebolla]
Yes que satisfacen el objetivo P. Si el objeto X
Yes
no verifica P, findall se verifica con L = [ ]
?- findall(Precio,item(_,Precio),L).
Precio Similar
= _G262a bagof y setof, pero ahora se
L = [120, incluyen en la
300, 275, lista
115, todos los elementos,
120]
Yes incluso aquellas soluciones que difieren en
otras variables de P
item(tomates, 120).
item(coliflor, 300).
item(pimiento, 275).
item(lechuga, 115).
item(cebolla, 120).
41
Otro ejemplo inspirado en el ejemplo del restaurante
verifica_plato(Plato):-
P =..[Plato, E],
setof(E,P,Es),
verifica_cal(Es).
verifica_cal([E|Es]):-
( calorias(E,_) -> true
;
format('No hay definición de calorias para \”~w\”.~n',[E])
),
verifica_cal(Es).
verifica_cal([]).
43
Conclusión