1. :- op(900, xfy, ou). :- op(800, xfy, e). resolve(Premissa e Premissas) :resolve(Premissa), resolve(Premissas). resolve(Premissa ou Premissas) :resolve(Premissa) ; resolve(Premissas). resolve(Objectivo) :facto(Objectivo). resolve(Objectivo) :findall(Corpo, regra(_,Objectivo, Corpo), Regras), ordenaCustos(Regras, [], Ordenadas), member(CorpoDaRegra, Ordenadas), resolve(CorpoDaRegra). resolve(Objectivo) :perguntavel(Objectivo), % verifica se o objectivo pode ser % avaliado perguntando ao utilizador perguntaAoUtilizador(Objectivo). ordenaCustos([], Regras, Ordenadas) :sort(Regras, RegrasOrdenadas), removeCustos(RegrasOrdenadas, Ordenadas). ordenaCustos([Corpo|Corpos], Regras, Ordenadas) :custoDaRegra(Corpo, Custo), ordenaCustos(Corpos, [Custo-Corpo|Regras], Ordenadas). custoDaRegra(Conjuncao1 ou Conjuncao2, Custo) :custoDaRegra(Conjuncao1, Custo1), custoDaRegra(Conjuncao2, Custo2), ( Custo1 > Custo2, Custo is Custo2 ; Custo is Custo1 ). custoDaRegra(Conjuncao1 e Conjuncoes, Custo) :custoDaRegra(Conjuncao1, Custo1), custoDaRegra(Conjuncoes, Custo2), Custo is Custo1 +Custo2. custoDaRegra(Premissa, Custo) :aval(Premissa, Custo). removeCustos([], []). removeCustos([_-Corpo|Regras], [Corpo|Mais]) :removeCustos(Regras, Mais). 2. a) Como na pergunta se pede apenas para codificar classes podemos utilizar a representacao: enquadramento(NomeDaClasse, SuperClasse, ListaDeAtributos) e utilizar o atomo nil para sinalizar a inexistencia de superclasse. enquadramento(ave, nil, [tamanho=Tamanho, cor=Cor]). enquadramento(passaro, ave, [tipoDeSementeQueCome=Semente]). enquadramento(aveMarinha, ave, [tipoDePeixeQueCome=Peixe]). enquadramento(pardal, passaro, [nome=Nome]). enquadramento(pisco, passaro, [nome=Nome]). Numa representacao mais abrangente, com instancias e classes, podemos incluir um argumento extra para indicar se se trata de uma classe ou de uma instancia. b) propriedades(Classe, Propriedades) :enquadramento(Classe, nil, Propriedades). propriedades(Classe, Propriedades) :enquadramento(Classe, SuperClasse, Props). propriedades(SuperClasse, MaisProps), append(Props, MaisProps, Propriedades). 3a Operadores: colocar(X,Y): Pré-Condições: limpo(Y), segurar(X) retirar(X,Y): pegar(X): largar(X): Junte: em(X,Y), braço_livre Apague: segurar(X), limpo(Y) Pré-Condições: em(X,Y), braço_livre, limpo(X) Junte: segurar(X), limpo(Y) Apague: em(X,Y), braço_livre Pré-Condições: na_mesa(X), limpo(X), braço_livre Junte: segurar(X), pos_livre(N+1) (ou pos_livre(Pos)) Apague: na_mesa(X), braço_livre, pos_livre(N) (ou Pos) Pré-Condições: segurar(X), pos_livre(N),N>0 (ou pos_livre(Pos)) Junte: braço-livre, na_mesa(X), pos_livre(N-1) Apague: segurar(X), pos_livre(N) (ou pos_livre(Pos)) 3b Plano: retirar(a,c), largar(a), retirar(b,d), colocar(b,c), pegar(d), colocar(d,a) 3c Tabela triangular: em(a,c) retirar(a,c) b_l p_l(1) seg(a) em(b,d) largar(a) b_l retirar(b,d) na_m(a) p_l(0) li( c) seg(b) li(d) colocar(b,c) b_l li(a) seg(d) em(b,c) 3d pegar(d) colocar(d,a) p_l(1) A1: se seg(X) então não b_l A2: se em(X,Y) então não limpo(Y) A3 (caso use Pos_livre(Pos)) se nada é dito então pos_livre(0) 4. a) member(X, conc(X, conc(Y, nil))) b) p(X) <- r(a,Y), q(Y), q(W) em(d,a)