Lógica Computacional

Propaganda
Lógica Computacional
LCC
2011/2012
1. Considere a seguinte base de conhecimento de um programa Prolog que manipula números naturais
unários:
q(a). q(b).
r(a,2). r(a,3). r(b,2).
h(c,4).
h(X,Y) :- q(X), r(X,Y).
Represente a árvore de derivação para o objectivo h(A,2).
2. Defina o predicado zip/3 que verifique se o emparelhamento de duas listas resultam numa terceira (e.g.
zip([1,2],[a,b],[(1,a),(2,b)]) deverá ser verdadeiro).
Nome:
Número:
Lógica Computacional
LCC
2011/2012
1. Considere a seguinte base de conhecimento de um programa Prolog que manipula números naturais
unários:
p(3). p(4).
s(2,x). s(3,y). s(4,x).
g(2,x).
g(X,Y) :- p(X), s(X,Y).
Represente a árvore de derivação para o objectivo g(A,x).
2. Considere que se representam de árvores binárias pelos termos vazia e nodo(X,E,D) (onde X, E, D
são respectivamente o elemento e as sub-árvores esquerda e direita). Defina um predicado altura/2
que permita calcular a altura de uma árvore binária.
Nome:
Número:
Lógica Computacional
LCC
2011/2012
1. Considere a seguinte base de conhecimento de um programa Prolog que manipula números naturais
unários:
lig(a,b). lig(b,c).
cam(X,Y) :- lig(X,Y).
cam(X,Y) :- lig(X,Z), cam(Z,Y).
Represente a árvore de derivação para o objectivo cam(a,Y).
2. Defina o predicado dobro/2 que verifique se uma lista resulta de calcular a operação “dobro” sobre
todos os elementos de uma lista de inteiros (e.g. dobro([2,4,6],[1,2,3]) deverá ser verdadeiro).
Nome:
Número:
Lógica Computacional
LCC
2011/2012
1. Considere a seguinte base de conhecimento de um programa Prolog que manipula números naturais
unários:
a(1,3). a(3,5).
p(X,X).
p(X,Y) :- a(X,Z), p(Z,Y).
Represente a árvore de derivação para o objectivo p(1,X).
2. Considere que se representam de árvores binárias pelos termos vazia e nodo(X,E,D) (onde X, E, D
são respectivamente o elemento e as sub-árvores esquerda e direita). Defina um predicado mirror/2
que permita calcular o simétrico de uma árvore binária (i.e. o que está na esquerda passa para a direita,
e vice-versa).
Nome:
Número:
/* 1.1 */
q(a). q(b).
r(a,2). r(a,3). r(b,2).
h(c,4).
h(X,Y) :- q(X), r(X,Y).
/*
h(A,2)
|
+- q(A), r(A,2)
|
+- [A=a] r(a,2)
| |
| +- true
|
+- [A=b] r(b,2)
|
+- true
As respostas são então "A=a" e "A=b".
*/
/* 1.2 */
zip([],[],[]).
zip([H1|T1],[H2,T2],[(H1,H2)|T]) :- zip(T1,T2,T).
/* 2.1 */
p(3). p(4).
s(2,x). s(3,y). s(4,x).
g(2,x).
g(X,Y) :- p(X), s(X,Y).
/*
g(A,x)
|
+- [A=2] true
|
+- p(A), s(A,x)
|
+- [A=3] s(3,x)
| |
| +- fail
|
+- [A=4] s(4,x)
|
+- true
As respostas são então "A=2" e "A=4".
*/
/* 2.2 */
altura(vazia,0).
altura(nodo(_,E,D),A) :- altura(E,AE), altura(D,AD), A is 1 + max(AE,AD).
/* obs: alternativamente, max podia ser calculado por um predicado definido */
/* 3.1 */
lig(a,b). lig(b,c).
cam(X,Y) :- lig(X,Y).
cam(X,Y) :- lig(X,Z), cam(Z,Y).
/*
cam(a,Y)
|
+- lig(a,Y)
| |
| +- [Y=b] true
|
+- lig(a,Z1), cam(Z1,Y)
|
+- [Z1=b] cam(b,Y)
|
+- lig(b,Y)
| |
| +- [Y=c) true
|
+- lib(b,Z2), cam(Z2,Y)
|
+- [Z2=c] cam(c,Y)
|
+- lig(c,Y)
| |
| +- fail
|
+- lig(c,Z3), cam(Z3,Y)
|
+- fail
As respostas são então "Y=b" e "Y=c".
*/
/* 3.2 */
dobro([],[])
dobro([HR|TR],[H|T]) :- HR is 2*H, dobro(TR,T).
/* 4.1 */
a(1,3). a(3,5).
p(X,X).
p(X,Y) :- a(X,Z), p(Z,Y).
/*
p(1,X)
|
+- [X=1] true
|
+- a(1,Z1), p(Z1,X)
|
+- [Z1=3] p(3,X)
|
+- [X=3] true
|
+- a(3,Z2), p(Z2,X)
|
+- [Z2=5] p(5,X)
|
+- [X=5] true
|
+- a(5,Z3), p(Z3,X)
|
+- fail
As respostas serão então [X=1], [X=3], e [X=5].
*/
/* 4.2 */
mirror(vazia,vazia).
mirror(nodo(X,E,D),nodo(X,DM,EM)) :- mirror(E,EM), mirror(D,DM).
Download