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).