PDF de programación - Tema 6: Programación lógica de segundo orden

Imágen de pdf Tema 6: Programación lógica de segundo orden

Tema 6: Programación lógica de segundo ordengráfica de visualizaciones

Publicado el 6 de Agosto del 2017
674 visualizaciones desde el 6 de Agosto del 2017
79,1 KB
21 paginas
Creado hace 21a (20/10/2002)
Programación Declarativa

Curso 2000–2001

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 2000–01

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 2000–01

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 2000–01

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 2000–01

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 2000–01

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 2000–01

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 2000–01

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 2000–01

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 2000–01

CcIa

Programación lógica de segundo orden

6.9

Todas las soluciones

x El predicado bagof

PD 2000–01

CcIa

Programación lógica de segundo orden

6.10

?- 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 2000–01

CcIa

Programación lógica de segundo orden

6.11

Todas las soluciones

x El predicado setof

PD 2000–01

CcIa

Programación lógica de segundo orden

6.12

?- 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 2000–01

CcIa

Programación lógica de segundo orden

6.13

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 2000–01

CcIa

Programación lógica de segundo orden

6.14

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 2000–01

CcIa

Programación lógica de segundo orden

6.15

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 2000–01

CcIa

Programación lógica de segundo orden

6.16

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 2000–01

CcIa

Programación lógica de segundo orden

6.17

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 2000–01

CcIa

Programación lógica de segundo orden

6.18

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 2000–01

CcIa

Programación lógica de segundo orden

6.19

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.
  • Links de descarga
http://lwp-l.com/pdf6144

Comentarios de: Tema 6: Programación lógica de segundo orden (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad