Programación Declarativa
Curso 2002–03
Tema 6: Programación lógica de
segundo orden
José A. Alonso Jiménez
Miguel A. Gutiérrez Naranjo
Dpto. de Ciencias de la Computación e Inteligencia Artificial
Universidad de Sevilla
PD 2002–03
CcIa
Programación lógica de segundo orden
6.1
Modificación de la B.C.
x Predicados assert y retract
u assert(+Term) inserta un hecho o una cláusula en la
base de conocimientos. Term es insertado como última
cláusula del predicado correspondiente.
u retract(+Term) elimina la primera cláusula de la base
u Ejemplos
de conocimientos que unifica con Term
?- hace_frio.
[WARNING: Undefined predicate: ‘hace_frio/0’]
No
?- assert(hace_frio).
Yes
?- hace_frio.
Yes
?- retract(hace_frio).
Yes
?- hace_frio.
No
PD 2002–03
CcIa
Programación lógica de segundo orden
6.2
Modificación de la B.C.
x El predicado listing
u listing(+Pred) lista las cláusulas en cuya cabeza
u Ejemplos
aparece el predicado Pred
?- listing(select).
select([A|B], A, B).
select([A|B], C, [A|D]) :- select(B, C, D).
Yes
?- assert( (gana(X,Y) :- rapido(X), lento(Y))).
X = _G445
Y = _G446
Yes
?- listing(gana).
gana(A, B) :-
rapido(A),
lento(B).
Yes
?- assert(rapido(juan)),assert(lento(jose)),
assert(lento(luis)).
Yes
?- gana(X,Y).
X = juan Y = jose ;
X = juan Y = luis ;
No
?- retract(lento(X)).
X = jose ;
X = luis ;
No
?- gana(X,Y).
No
PD 2002–03
CcIa
Programación lógica de segundo orden
6.3
Modificación de la B.C.
x Los predicados asserta y assertz
u asserta(+Term) equivale a assert/1, pero Term es inser-
tado como primera cláusula del predicado correspon-
diente
u assertz(+Term) equivale a assert/1
u Ejemplos
?- assert(p(a)), assertz(p(b)), asserta(p(c)).
Yes
?- p(X).
X = c ;
X = a ;
X = b ;
No
?- listing(p).
p(c).
p(a).
p(b).
Yes
PD 2002–03
CcIa
Programación lógica de segundo orden
6.4
Modificación de la B.C.
x Los predicados retractall y abolish
u retractall(+Head) elimina de la base de conocimientos
u abolish(+SimbPred/+Aridad) elimina de la base de
todas las cláusulas cuya cabeza unifica con Head
conocimientos todas las cláusulas que en su cabeza
aparece el símbolo de predicado SimbPred/Aridad
u abolish(+SimbPred, +Aridad) es equivalente a
u Ejemplo
abolish(+SimbPred/+Aridad)
?- assert(p(a)), assert(p(b)).
Yes
?- retractall(p(_)).
Yes
?- p(a).
No
?- assert(p(a)), assert(p(b)).
Yes
?- abolish(p/1).
Yes
?- p(a).
[WARNING: Undefined predicate: ‘p/1’]
No
PD 2002–03
CcIa
Programación lógica de segundo orden
6.5
Modificación de la B.C.
Y = b ;
Y = a ;
Y = b ;
Y = b ;
?- assert(f(a,b)).
Yes
?- f(X,Y).
X = a
?- asserta(f(a,a)),assertz(f(b,b)).
Yes
?- f(X,Y).
X = a
X = a
X = b
?- listing(f).
f(a, a).
f(a, b).
f(b, b).
?- retract(f(_,a)).
Yes
?- listing(f).
f(a, b).
f(b, b).
?- assert(f(b,a)).
Yes
?- listing(f).
f(a, b).
f(b, b).
f(b, a).
?- retractall(f(b,_)).
Yes
?- listing(f).
f(a, b).
?- abolish(f/2).
Yes
?- listing(f).
[WARNING: No predicates for ‘f’]
No
PD 2002–03
CcIa
Programación lógica de segundo orden
6.6
Modificación de la B.C.
x Multiplicaciones (tabla.pl)
u crea tabla añade los hechos producto(X,Y,Z) donde X
e Y son números de 0 a 9 y Z es el producto de X e Y.
crea_tabla :-
L = [0,1,2,3,4,5,6,7,8,9],
member(X,L),
member(Y,L),
Z is X*Y,
assert(producto(X,Y,Z)),
fail.
crea_tabla.
u Sesión:
?- crea_tabla.
Yes
?- listing(producto).
producto(0, 0, 0). producto(0, 1, 0).
... producto(9, 8, 72). producto(9, 9, 81).
...
Yesu Determinar las descomposiciones de 6 en producto de
dos números.
?- producto(A,B,6).
A = 1
B = 6 ;
No
A = 2
B = 3 ;
A = 3
B = 2 ;
A = 6
B = 1 ;
PD 2002–03
CcIa
Programación lógica de segundo orden
6.7
Modificación dinámica de la BC
x Programa
:- dynamic r/2.
relacionados(X,Y) :-
assert(r(X,Y)).
no_relacionados(X,Y) :-
retract(r(X,Y)).
x Sesión
?- r(X,Y).
No
?- relacionados(a,b).
Yes
?- r(X,Y).
X = a
Y = b ;
No
?- no_relacionados(a,b).
Yes
?- r(a,b).
No
?- relacionados(a,b), relacionados(c,d).
Yes
?- r(X,Y).
X = a
Y = b ;
X = c
Y = d ;
No
PD 2002–03
CcIa
Programación lógica de segundo orden
6.8
Todas las soluciones
x El predicado findall
?- assert(clase(a,voc)),
assert(clase(b,con)),
assert(clase(e,voc)),
assert(clase(c,con)).
Yes
?- findall(X,clase(X,voc),L).
X = _G331
L = [a, e]
Yes
?- findall(_X,clase(_X,voc),L).
L = [a, e]
Yes
?- findall(_X,clase(_X,_Clase),L).
L = [a, b, e, c]
Yes
?- findall(X,clase(X,vocal),L).
X = _G355
L = []
Yes
?- findall(X,(member(X,[c,b,c]),member(X,[c,b,a])),L).
X = _G373
L = [c, b, c]
Yes
?- findall(X,(member(X,[c,b,c]),member(X,[1,2,3])),L).
X = _G373
L = []
Yes
PD 2002–03
CcIa
Programación lógica de segundo orden
6.9
Todas las soluciones
x El predicado bagof
?- bagof(X,clase(X,voc),L).
X = _G331
L = [a, e]
Yes
?- bagof(X,clase(X,Clase),L).
X = _G343
X = _G343
No
Clase = voc
Clase = con
L = [a, e] ;
L = [b, c] ;
% L = {X: (existe Y)[clase(X,Y)]}
?- bagof(X,Y^clase(X,Y),L).
X = _G379
No
Y = _G380
L = [a, b, e, c] ;
?- bagof(_X,_Y^clase(_X,_Y),L).
L = [a, b, e, c] ;
No
?- bagof(letra(_X),_Y^clase(_X,_Y),L).
L = [letra(a), letra(b), letra(e), letra(c)]
Yes
?- bagof(X,clase(X,vocal),L).
No
?- bagof(X,(member(X,[c,b,c]),member(X,[c,b,a])),L).
X = _G361
L = [c, b, c] ;
No
?- bagof(X,(member(X,[c,b,c]),member(X,[1,2,3])),L).
No
PD 2002–03
CcIa
Programación lógica de segundo orden
6.10
Todas las soluciones
x El predicado setof
?- setof(X,clase(X,voc),L).
X = _G331
L = [a, e]
Yes
?- setof(X,clase(X,Clase),L).
X = _G343
X = _G343
No
Clase = voc
Clase = con
L = [a, e] ;
L = [b, c] ;
% L = {X: (existe Y)[clase(X,Y)]}
?- setof(X,Y^clase(X,Y),L).
X = _G379
No
Y = _G380
L = [a, b, c, e] ;
?- setof(_X,_Y^clase(_X,_Y),L).
L = [a, b, c, e] ;
No
?- setof(letra(_X),_Y^clase(_X,_Y),L).
L = [letra(a), letra(b), letra(c), letra(e)]
Yes
?- setof(X,clase(X,vocal),L).
No
?- setof(X,(member(X,[c,b,c]),member(X,[c,b,a])),L).
X = _G361
L = [b, c]
Yes
?- setof(X,(member(X,[c,b,c]),member(X,[1,2,3])),L).
No
PD 2002–03
CcIa
Programación lógica de segundo orden
6.11
Todas las soluciones
x Operaciones conjuntistas
u interseccion(S,T,U) se verifica si U es la intersección
de S y T. Por ejemplo,
?- interseccion([1,4,2],[2,3,4],U).
U = [2,4]
interseccion(S,T,U) :-
setof(X, (member(X,S), member(X,T)), U).
u diferencia(S,T,U) se verifica si U es la diferencia de los
conjuntos de S y T. Por ejemplo,
?- diferencia([5,1,2],[2,3,4],U).
U = [1,5]
diferencia(S,T,U) :-
setof(X, (member(X,S), not(member(X,T))), U).
u n union(S,T,U) se verifica si U es la unión de S y T. Por
ejemplo,
?- n_union([1,2,4],[2,3,4],U).
U = [1,2,3,4]
n_union(S,T,U) :-
setof(X, (member(X,S); member(X,T)), U).
PD 2002–03
CcIa
Programación lógica de segundo orden
6.12
Todas las soluciones
u partes(X,L) se verifica si L es el conjunto de las partes
de X. Por ejemplo,
?- partes([a,b],L).
L = [[], [a], [a, b], [b]]
partes(X,L) :-
setof(Y,subconjunto(Y,X),L).
subconjunto([],[]).
subconjunto([X|L1],[X|L2]) :-
subconjunto(L1,L2).
subconjunto(L1,[_|L2]) :-
subconjunto(L1,L2).
PD 2002–03
CcIa
Programación lógica de segundo orden
6.13
Todas las soluciones
x Definición de findall
u Definición
n_findall(X,Objetivo,_Lista_de_X):-
Objetivo,
assert(almacena(X)),
fail.
n_findall(_X,_Objetivo,Lista_de_X):-
assert(almacena(fin)),
recoge(Lista_de_X).
recoge(L):-
retract(almacena(X)),
!,
recoge_aux(X,L).
recoge_aux(fin,[]):- !.
recoge_aux(X,[X|L]):-
recoge(L).
u Sesión
?- assert(p(a)), assert(p(b)).
Yes
?- listing(p).
p(a).
p(b).
Yes
?- n_findall(X,p(X),L).
X = _G163
L = [a, b]
Yes
PD 2002–03
CcIa
Programación lógica de segundo orden
6.14
Predicados de segundo orden
x El predicado apply
u n apply(+Term,+Lista) se verifica si es demostrable
Term después de aumentar el número de sus argumen-
tos con los elementos de Lista
u Ejemplo
?- plus(1,2,X).
X = 3
Yes
?- n_apply(plus,[1,2,X]).
X = 3 ;
No
?- n_apply(plus(1),[2,X]).
X = 3
Yes
?- n_apply(plus(1,2),[X]).
X = 3
Yes
?- n_apply(append([1,2]),[X,[1,2,3,4,5]]).
X = [3, 4, 5] ;
Nou Programa n apply(+Term,+List)
n_apply(Term,List):-
Term =.. [Pred|Arg1],
append(Arg1,List,Arg2),
Atomo =.. [Pred|Arg2],
Atomo.
u El predicado predefinido apply
PD 2002–03
CcIa
Programación lógica de segundo orden
6.15
Predicados de segundo orden
x Patrones aplicativos y maplist
u padre(X,P) se verifica si P es el padre de X
padre(beatriz,andres).
padre(david, carlos).
padre(elisa, ernesto).
u madre(X,M) se verifica si M es la madre de X
madre(beatriz,maria).
madre(david, eva).
madre(elisa, carmen).
u padres(L1,L2) se verifica si cada elemento de L2 es el
padre del correspondiente elemento de L1. Por ejem-
plo,
?- padres([beatriz,david,elisa],L).
L = [andres, carlos, ernesto]
Yes
padres([],[]).
padres([X|R1],[P|R2]):-
padre(X,P),
padres(R1,R2).
PD 2002–03
CcIa
Programación lógica de segundo orden
6.16
Predicados de segundo orden
u madres(L1,L2) se verifica si cada elemento de L2 es la
madre del correspondiente elemento de L1. Por ejem-
plo,
?- madres([beatriz,david,elisa],L).
L = [maria, eva, carmen]
Yes
madres([],[]).
madres([X|R1],[M|R2]):-
madre(X,M),
madres(R1,R2).
u Preguntas con maplist
?- maplist(padre,[beatriz,david,elisa],L).
L = [andres, carlos, ernesto]
Yes
?- maplist(madre,[beatriz,david,elisa],L).
L = [maria, eva, carmen]
Yesu Definición de maplist
n_maplist(_,[],[]).
n_maplist(R,[X1|L1],[X2|L2]) :-
apply(R,[X1,X2]),
n_maplist(R,L1,L2).
PD 2002–03
CcIa
Programación lógica de segundo orden
6.17
Contenido
u Programación lógica de segundo orden:
1. Modificación de la base de conocimiento:
(a) Relaciones para ampliar B.C.: assert, asserta
y assertz.
(b) Relación para consultar la B.C.: listing.
(c) Relaciones para reducir
la BC:
retract,
retractall y abolish.
(d) Ejemplo: producto mediante tabla de multi-
plicar.
2. Modificación dinámica de la BC:
(a) La declaración dynamic.
3. Todas las soluciones:
(a) Las relaciones findall, bagof y seto
Comentarios de: Tema 6: Programación lógica de segundo orden (0)
No hay comentarios