Faculdade de Engenharia da Universidade do Porto Mestrado Integrado Engenharia Informática e Computação Mestrado Integrado Eng. Electrotécnica e de Computadores Programação em Lógica 2009/2010 3º Ano MIEIC/ 4º Ano MIEEC Época da Época Recurso – Proposta de resolução Nome: Data: 04/02/2010 GRUPO I – Programação em Prolog (13 val.) 1) venda(a,1). venda(a,2). venda(a,3). venda(b,1). venda(b,1). venda(b,3). venda(b,3). %1.1) Experimentar... %1.2) nvendas(X,Y,NV):Y, venda(X,Y), ListaV), length(ListaV, NV). findall(X-Y, %1.3) :-dynamic(venda/2). introduz_vendas:pede_cliente(C), pede_produto(P), assert(venda(C,P)), analisa_venda(C,P). pede_cliente(C):repeat, write('Cliente? ite('Cliente? '), read(C), C@>=a, C@=<z. pede_produto(P):repeat, write('Produto? '), read(P), P@>=1, P@=<99. analisa_venda(C,P):nvendas(C,P,N1), N1>1, write('Repetido '), write(N1), write('!'), nl, !. analisa_venda(C,P):nvendas(C,_,N2), (N2==1, write('1ª Compra Cliente '), write(C), nl; write('Compra Cliente '), write(C), write(':'), write(N2), nl), nvendas(_,P,N3), (N3==1, =1, write('1ª Compra Produto '), write(P), nl; write('Compra Produto '), write(P), write(':'), write(N3), nl). 2) %2.1) dentro(irina,natasha). dentro(natasha,olga). dentro(olga,katarina). in(X,Y) :- dentro(X,Y). in(X,Y) :- dentro(X,Z), in(Z,Y). Luis Paulo Reis / Rui Gomes / Eugénio da Costa Oliveira 1/3 %2.2) copia_alternado(L,N,Res):copia_alt(L,N,R), Res=..[solucao|R]. copia_alt(L,N,[HN|R]):membroN(L,N,LRest,HN),!, copia_alt(LRest,N,R). copia_alt(_,_,[]). membroN([H|R],1,R,H). membroN([_|R2],N,R,H):- N2 is N-1, membroN(R2,N2,R,H). %2.3) multiplica_n([],_,[]). multiplica_n([H|T],N,LR):lista_n(H,N,LN), append(LN,L2,LR), multiplica_n(T,N,L2). lista_n(_,0,[]):-!. lista_n(H,N,[H|T]):- N2 is N-1, lista_n(H,N2,T). %2.4) em_cima_de(livro, secretaria). em_cima_de(bloco_notas, livro). em_cima_de(caneta, bloco_notas). em_cima_de(livro, secretaria). % Exercicio Alternativo com dois livros distintos: %em_cima_de(livro_prolog, secretaria). %em_cima_de(bloco_notas, livro_prolog). %em_cima_de(caneta, bloco_notas). %em_cima_de(livro_C, secretaria). sobre(X,Y):- em_cima_de(X,Y). sobre(X,Y):- em_cima_de(X,Z), sobre(Z,Y). % Alinea b) - substituir duas linhas anteriores pela seguinte: % sobre(X,Y) :- sobre(X,Z), sobre(Z,Y). % Experimentar... 3) Exercício para pensar em casa... Luis Paulo Reis / Rui Gomes / Eugénio da Costa Oliveira 2/3 GRUPO II– Programação em Lógica com Restrições (7.0 val.) 4) :-use_module(library(clpfd)). %4.1) solve(Vars):Vars=[A,B,C,D,E,F], domain(Vars,1,9), all_distinct(Vars), A*B*C #= D*E*F, A+B #= D+E, A#<B, D#<E, A#<D, !, labeling([],Vars). %4.2) encomendas([2,4,8,16,32,64,128,256,512,1024], [2,4,11,23,47,95,191,383,767,1535]). leva_misto(P,L):encomendas(LP,LL), length(LP,N), length(Vars,N), domain(Vars,0,1), scalar_product(LP,Vars,#=<,P), scalar_product(LL,Vars,#>=,L),!, labeling([ff],Vars), write(Vars). %4.3) a) %?- escolhe([12,23,11,37,2,13],36,X). escolhe(Cheques, VMin, Escolha):length(Cheques,NVars), length(Vars, NVars), domain(Vars,0,1), scalar_product(Cheques,Vars,#=,ValCheques), ValCheques #>= VMin, sum(Vars,#=,NCheques), FAval #= (ValCheques-VMin)*NVars+NCheques, !, % novas_restricoes(Cheques, Vars), minimize((labeling([ff],Vars),write(Vars-FAval),nl),FAval), cria_sol(Vars,Cheques,Escolha). cria_sol([],[],[]). cria_sol([1|RV], [Ch|RC], [Ch|RE]):- cria_sol(RV, RC, RE). cria_sol([0|RV], [_|RC], RE):- cria_sol(RV, RC, RE). %4.3) b) novas_restricoes(Cheques, Vars):minimax_cheques(NMin,NMax), sum(Vars,#>=,NMin), sum(Vars,#=<,NMax), valor_num(LVN), mult_listas(Cheques,Vars,LCVars), % Como Implementar? valor_rest(LVN,LCVars), % Como Implementar? Pensar um pouco... nao_consecutivos(NCons), ncons_rest(NCons,Vars). % Como Implementar? Pensar um pouco... Luis Paulo Reis / Rui Gomes / Eugénio da Costa Oliveira 3/3