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
Download

Tópicos de Resolução do Exame de Recurso