Você está na página 1de 119

Cap tulo 5 Prolog

L ogica para Programa ca o LEIC - Tagus Park 1o Semestre, Ano Lectivo 2007/08 c In es Lynce

Bibliograa

Baseados nos slides de Andrew Rice, Universidade de

Cambridge, 2007.
Martins J.P., Prolog, Cap tulo 5. Ben-Ari M., Mathematical Logic for Computer Science,

Springer-Verlag, 2003, Cap tulo 8.

Paradigmas de programa c ao

Programa ca o funcional (e.g. Scheme) Programa ca o imperativa (e.g. C) Programa ca o em l ogica (e.g. Prolog) Exemplo: fun c ao soma - recebe uma lista de inteiros, devolve um inteiro que corresponde ` a soma dos elementos da lista
soma([],0). % soma para lista vazia e0 soma([Cabeca|Cauda],N) :soma(Cauda,M), N is M+Cabeca. % a soma da lista com a cabe ca Cabeca e a cauda Cauda eN % se a soma da lista Cauda e M e N=M+Cabeca

Em programa ca o em l ogica Programa = l ogica + controlo

PROLOG = PROgrama c ao em LOGica

Introduzido em 1973 no a mbito do processamento de l ngua

natural
Colmerauer, A., Kanoui, H., Roussel, P . and Pasero, R. Un systeme de communication hommemachine en fran cais, Groupe de Recherche en Intelligence Articielle, Universit e dAix-Marseille. 1973. SWI-Prolog http://www.swi-prolog.org/ Open-source Desenvolvido desde 1987 Dispon vel para plataformas Linux, Mac e Windows

Prolog: conceitos b asicos

Programa = factos + regras Factos correspondem a arma co es; consistem em letras de

predicado (iniciados com letra min uscula) com 1 ou + argumentos


Exemplos
numero(1234). pessoa(ana). idade(jose,22). frequenta(rui,lp).

Correspondem a cl ausulas de Horn que consistem num literal positivo Terminam com ponto nal (.)

Prolog: conceitos b asicos (cont.)

Regras permitem realizar infer encia Correspondem a cl ausulas de Horn com um literal positivo e pelo menos um literal negativo Exemplo
avo(X,Z) :- ascendente directo(Y,X), ascendente directo(Z,Y).

Operador :- deve ser interpretado como se e , deve ser interpretada como e


Regra anterior deve ser interpretada como X e av o de Z se Y for ascendente directo de X e Z for ascendente directo de Y

Executar um programa implica colocar quest oes Quest oes correspondem a objectivos: cl ausulas de Horn que t em somente literais negativos
?- avo(pedro,nuno).

Exemplo b asico de interac c ao em Prolog

Janela de interac ca o Linux: comando pl Mac: comando swipl Windows: comando plwin.exe
Tipicamente e criado um shortcut no Desktop durante a instala ca o No caso de se pretender trabalhar na linha de comandos (MS-DOS) usar plcon.exe

Aceita somente comandos e objectivos Termina com o comando halt. (ou CTRL+D)

Exemplo b asico de interac c ao em Prolog (cont.)

Programa (regras ou factos) + Objectivo Unica c ao e fundamental Tipicamente programas s ao escritos num cheiro (.pl) ?- [<nome-programa>]. carrega o programa Alternativa: [user]. Objectivos tamb em podem ser inclu dos no cheiro Antecedidos por : Objectivos com v arias respostas <Enter> aceita uma resposta ; pede a resposta seguinte

Exemplo b asico de interac c ao em Prolog

Exemplo b asico de interac c ao em Prolog (cont.)

Exemplo b asico de interac c ao em Prolog (cont.)

Estruturas de dados simples: constantes


Constantes: a tomos + n umeros Atomos Cadeias que podem incluir letras, d gitos e (underscore) e que t em de ser iniciadas por letra min uscula
ana, nuno, ana silva, x 25

Cadeias de caracteres especiais


< >, . . . , . : . Aten ca o: n ao podem coincidir com cadeias que t em um signicado pr e-denido (e.g. : )

Cadeias de caracteres limitadas por plicas


ana, Ana Silva

N umeros Inteiros e reais


1, -97, 3.1415, -0.0035

Estruturas de dados simples: vari aveis

Cadeias que podem incluir letras, d gitos e

e que t em de ser

iniciadas por letra Mai uscula ou


X, Resultado, Lista participantes, x23 Vari avel representa uma vari avel sem nome Vari aveis singleton: aparecem somente uma vez numa cl ausula; podem sempre ser substitu das por Dom nio de uma vari avel corresponde a uma u nica cl ausula

Estruturas de dados compostas

Correspondem a ` aplica ca o de uma fun ca o Permitem criar objectos que agrupam um conjunto de

objectos
tipo-de-objecto(componente-1,componente-2,. . .) Exemplo
data(Dia,Mes,Ano). (seria suciente data( , , )) data(14,novembro,2007). data(25,dezembro,2000). dataDeNascimento(pessoa,(13,junho,1888)).

Puzzle da zebra (atribu do a Einstein)


5 casas, 5 nacionalidades, 5 marcas de cigarro, 5 bebidas, 5

animais de estima ca o (todos diferentes)


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. O Ingl es vive numa casa vermelha. O Espanhol e dono de um c ao. Na casa verde bebe-se caf e. O Ucraniano bebe ch a. A casa verde est a imediatamente ` a direita da casa branca. A pessoa que fuma Old Gold e dona de uma cobra. Na casa amarela fuma-se Kools. Na casa do meio bebe-se leite. O Noruegu es vive na primeira casa. A pessoa que fuma Chesterelds vive na casa ao lado da casa onde vive uma raposa. Os cigarros Kools s ao fumados na casa ao lado da casa onde vive um cavalo. O fumador de Lucky Strike bebe sumo de laranja. O Japon es fuma Parliaments. O Noruegu es vive junto ` a casa azul.

Puzzle da zebra (cont.)

Objectivos Onde e que a zebra vive? Em que casa e que se bebe agua? Para j a vamos considerar apenas a exist encia de factos e

objectivos

Puzzle da zebra: modela c ao

Representa ca o de cada casa

house(Nationality,Pet,Smokes,Drinks,Colour)
Representa ca o da la de casas (designada Houses)

(H1,H2,H3,H4,H5)

Puzzle da zebra: c odigo

O Ingl es vive numa casa vermelha. exists(house(english, , , ,red),Houses)

exists(A,(A, , , , )). exists(A,( ,A, , , )). exists(A,( , ,A, , )). exists(A,( , , ,A, )). exists(A,( , , , ,A)).
exists(A, , , , ) e satisfeito se a casa A unica com a

primeira casa

Puzzle da zebra: c odigo (cont.)

A casa verde est a imediatamente a ` direita da casa branca. rightOf(house( , , , ,green),house( , , , ,ivory),Houses)

rightOf(A,B,(B,A, , , )). rightOf(A,B,( ,B,A, , )). rightOf(A,B,( , ,B,A, )). rightOf(A,B,( , , ,B,A)).

Puzzle da zebra: c odigo (cont.)

Na casa do meio bebe-se leite. middleHouse(house( , , ,milk, ),Houses) middleHouse(A,( , ,A, , )). O Noruegu es vive na primeira casa. firstHouse(house(norwegian, , , , ),Houses) firstHouse(A,(A, , , , )).

Puzzle da zebra: c odigo (cont.)


A pessoa que fuma Chesterelds vive na casa ao lado da casa

onde vive uma raposa.


nextTo(house( , ,chesterfields, , ), house( ,fox, , , ),Houses)

nextTo(A,B,(A,B, , , )). nextTo(A,B,( ,A,B, , )). nextTo(A,B,( , ,A,B, )). nextTo(A,B,( , , ,A,B)). nextTo(A,B,(B,A, , , )). nextTo(A,B,( ,B,A, , )). nextTo(A,B,( , ,B,A, )). nextTo(A,B,( , , ,B,A)).

Puzzle da zebra: c odigo - objectivo


:exists(house(english, , , ,red),Houses), exists(house(spanish,dog, , , ),Houses), exists(house( , , ,coffee,green),Houses), exists(house(ukranian, , ,tea, ),Houses), rightOf(house( , , , ,green),house( , , , ,ivory),Houses), exists(house( ,snail,oldgold, , ),Houses), exists(house( , ,kools, ,yellow),Houses), middleHouse(house( , , ,milk, ),Houses), firstHouse(house(norwegian, , , , ),Houses), nextTo(house( , ,chesterfields, , ),house( ,fox, , , ),Houses), nextTo(house( , ,kools, , ),house( ,horse, , , ),Houses), exists(house( , ,luckystrike,orangejuice, ),Houses), exists(house(japanese, ,parliaments, , ),Houses), nextTo(house(norwegian, , , , ),house( , , , ,blue),Houses), exists(house(WaterDrinker, , ,water, ),Houses), exists(house(ZebraOwner,zebra, , , ),Houses), write(WaterDrinker = ), write(WaterDrinker), nl, write(ZebraOwner = ), write(ZebraOwner),nl, write(Houses).

Puzzle da zebra: execu c ao

Regras

regra(X,Y) :- parte1(X),parte2(X,Y). regra(X,Y) corresponde ` a cabe ca parte1(X),parte2(X,Y) corresponde ao corpo Signicado: regra(X,Y) e verdadeira se parte1(X) e

verdadeira e parte2(X,Y) e verdadeira

Vari aveis internas s ao comuns

regra2(X) :- algo(X,Z),casocontrario(Z). Signicado: regra2(X) e verdadeira se existe Z tal que

algo(X,Z) e verdadeiro e casocontrario(Z) e verdadeiro

Overloading de predicados em Prolog

poss E vel fazer overloading de predicados O mesmo predicado pode ser denido com um n umero de argumentos diferente e com signicados diferentes
A cl ausula

predicado xpto. corresponde a predicado xpto/0


A cl ausula

predicado xpto(A). corresponde a predicado xpto/1

Listas

Representadas por uma sequ encia de elementos limitados por

par entesis rectos [el1 , . . . , eln ]


[] representa a lista vazia S mbolo | permite refer encia a ` cauda da lista Lista [tenis,judo,natacao] unica com
[Cabeca|Cauda] [tenis|Cauda] [El1,El2|Cauda] [tenis,judo|Cauda] [tenis,judo,natacao|[]] ...

Puzzle da zebra com LISTAS e REGRAS

Houses passa a ser uma lista com 5 elementos do tipo house

Houses([house( house( house( house( house(

, , , , ,

, , , , ,

, , , , ,

, , , , ,

), ), ), ), )]).

Acrescentar ao objectivo

houses(House)

Puzzle da zebra com LISTAS e REGRAS (cont.)

Regras para exists, rightOf e nextTo

exists(X,[X| ]). exists(X,[ |Y]) :- exists(X,Y). rightOf(A,B,[B,A| ]). rightOf(A,B,[ |Y]) :- rightOf(A,B,Y). nextTo(A,B,[A,B| ]). nextTo(A,B,[B,A| ]). nextTo(A,B,[ |Y]) :- nextTo(A,B,Y).

Regras e listas: outro exemplo

ultimo([X],X). ultimo([ |Cauda],X) :- ultimo(Cauda,X).

Express oes aritm eticas

Igualdade (=) n ao faz unica ca o Por exemplo em A = 1+2. o operador + cria um termo composto
1+2 e o mesmo que +(1,2)

Operador is avalia numericamente a express ao do lado direito

e unica com express ao do lado esquerdo


Outras fun co es aritm eticas j a denidas em Prolog: >,<,>=,=<,=\=,=:=,-,*,abs,max,log,sin,...

Express oes aritm eticas: exemplo

Com utiliza ca o de , para a conjun ca o e ; para disjun ca o

?- X is 3+4. X = 7 ?- (6>5, 3 =:= 4, X is 3; X is 8). X = 8 ?- (6>5, 3 =\= 4, X is 3; X is 8). X = 3

Regras, listas e express oes aritm eticas: exemplo

soma([],0). soma([Cabeca|Cauda],N) :-

soma(Cauda,M), N is M+Cabeca.

Regras, listas e express oes aritm eticas: execu c ao

Regras, listas e express oes aritm eticas: execu c ao (cont.)

Comprimento de uma lista (O (N ))

Requisitos de mem oria: O (N ) para lista de comprimento N

comp1([],0). comp1([ |Cauda],N) :- comp1(Cauda,M), N is M+1. ?- comp1([1,2],X). comp1([1|[2]],X) :- comp1([2],M), X is M+1. comp1([2|[]],M) :- comp1([],M1), M is M1+1. comp1([],0). M1 = 0 M is M1+1 M = 1 X is M+1 X = 2 comp1([1,2],2)

Comprimento de uma lista (O (1))


Requisitos de mem oria: O (1)

comp2(Lista,Res) :- comp2(Lista,0,Res). comp2([],Acum,Acum). comp2([ |Cauda],Acum,Res) :Acum1 is Acum+1, comp2(Cauda,Acum1,Res). ?- comp2([1,2],X). comp2([1,2],X) :- comp2([1,2],0,X). comp2([1|[2]],0,X) :Acum1 is 0+1, comp2([2],Acum1,X). comp2([2|[]],1,X) :Acum1 is 1+1, comp2([],Acum1,X). comp2([],2,2). X=2 comp2([1,2],2)

Comprimento de uma lista: execu c ao

Import ancia da ordem das cl ausulas

Prolog segue estrat egia de procura em profundidade com

retrocesso
Pode nunca encontrar solu c ao (mesmo que ela exista) caso siga por um caminho innito Fun c ao de selec c ao escolhe o primeiro literal do objectivo Regra de procura escolhe a primeira cl ausula determinada

Import ancia da ordem das cl ausulas: arvore SLD

p(a). p(b). p(c). q(c). : p(X),q(X).

: p(X),q(X). : q(a). : q(b). : q(c).

Import ancia da ordem das cl ausulas: exemplo

Remo c ao de um elemento de uma lista

remove(Cabeca,[Cabeca|Cauda],Cauda). remove(X,[Cabeca|Cauda1],[Cabeca|Cauda2]) :remove(X,Cauda1,Cauda2). ?- remove(El,[1,2,3],Res).

?- remove(El,[1,2,3],Res).: arvore SLD

remove(El,[1,2,3],Res).

El=1, Res = [2,3]

?- remove(El,[1,2,3],Res).: arvore SLD

remove(El,[1,2,3],Res) El=2,

Res = [1,3]

remove(El,[2,3],Cauda2)
El=2, Cauda2 = [3]

?- remove(El,[1,2,3],Res).: arvore SLD

remove(El,[1,2,3],Res) El=3,

Res = [1,2]

remove(El,[2,3],Cauda2)
El=3, Cauda2 = [2]

remove(El,[3],Cauda22)
El=3, Cauda22 = []

?- remove(El,[1,2,3],Res).: arvore SLD

remove(El,[1,2,3],Res)

No

remove(El,[2,3],Cauda2)

remove(El,[3],Cauda22)

remove(El,[],Cauda23)

?- remove(El,[1,2,3],Res).: arvore SLD

Permuta c ao de listas

perm([],[]). perm(Lst,[Cabeca|Cauda]) :remove(Cabeca,Lst,Res),perm(Res,Cauda).

Permuta c ao de listas: exemplo

Problema das 8 rainhas

[5,3,1,7,2,8,6,4]

Problema das 8 rainhas - c odigo

oito-rainhas(Res) :perm([1,2,3,4,5,6,7,8],Res), diagonaisOK(Res).

Problema das 8 rainhas - c odigo (cont.)

diagonaisOK([ ]). diagonaisOK([Rainha|OutrasRainhas]) :posicaoOK(Rainha,1,OutrasRainhas), diagonaisOK(OutrasRainhas). posicaoOK( , ,[]). posicaoOK(Col,DistLinha,[Rainha|OutrasRainhas]) :DiagKO1 is Col + DistLinha, Rainha =\= DiagKO1, DiagKO2 is Col - DistLinha, Rainha =\= DiagKO2, DistLinha1 is DistLinha + 1, posicaoOK(Col,DistLinha1,OutrasRainhas).

Resolu c ao de problemas por gera c ao&teste

Metodologia usada na resolu ca o do problema das 8 rainhas 1. Gerar uma potencial solu c ao 2. Vericar se a solu c ao e v alida 3. Se n ao for v alida retroceder para encontrar a potencial solu c ao seguinte

Como guardar todas as solu co es?

Existem tr es predicados pr e-denidos que permitem guardar

todos os objectos resultantes de uma resposta correcta


1. bagof guarda colec co es de instancia co es poss veis 2. setof guarda colec co es ordenadas e sem repeti co es de instancia co es poss veis 3. findall igual a bagof mas quantica existencialmente vari aveis Sintaxe:

bagof|setof|findall(<Objecto>,<Objectivo>,<Res>)

Guardar solu co es: exemplo


p(3,5,2). p(1,3,5). p(2,4,2). p(2,4,1). p(4,3,1). ?- bagof(Z,p(X,Y,Z),Saco). X = 1 Y = 3 Saco = [5] ; X = 2 Y = 4 Saco = [2,1] ; X = 3 Y = 5 Saco = [2] ; X = 4 Y = 3 Saco = [1] ?- setof(Z,p(X,Y,Z),Conjunto). X = 1 Y = 3 Conjunto = [5] ; X = 2 Y = 4 Conjunto = [1,2] ; X = 3 Y = 5 Conjunto = [2] ; X = 4 Y = 3 Conjunto = [1] ?- findall(Z,p(X,Y,Z),Saco). Saco = [2, 5, 2, 1, 1]

Guardar solu co es: exemplo (cont.)

Objectivo bagof(Z,X^Y^p(X,Y,Z),Saco) corresponde ao

Saco de Zs tal que existe um X e existe um Y para os quais se verica p(X,Y,Z)


Corresponde ` a quantica c ao existencial de vari aveis ?- bagof(Z,X^Y^p(X,Y,Z),Saco). Saco = [2, 5, 2, 1, 1] ?- setof(Z,X^Y^p(X,Y,Z),Conjunto). Conjunto = [1, 2, 5]

Guardar solu co es: exemplo (cont.)

Por analogia... ?- bagof(Z,X^p(X,Y,Z),Saco). Y = 3, Saco = [5, 1] ; Y = 4, Saco = [2, 1] ; Y = 5, Saco = [2] ?- setof(Z,X^p(X,Y,Z),Conjunto). Y = 3, Conjunto = [1, 5] ; Y = 4, Conjunto = [1, 2] ; Y = 5, Conjunto = [2]

Guardar solu co es: exemplo (cont.)

findall devolve a lista vazia [] se o objectivo n ao e satisfeito,

enquanto que bagof falha


?- bagof(Z,(p(X,Y,Z),Z>5),Saco). No ?- findall(Z,(p(X,Y,Z),Z>5),Saco). Saco = []

Manipula c ao da base de conhecimento

assert(Clausula) adiciona a cl ausula Clausula a ` base de

conhecimento (em tempo de execu ca o)


retract(Clausula) remove a cl ausula Clausula da base de

conhecimento
abolish(Nome Predicado,Aridade Predicado) remove

todas as cl ausulas do predicado Nome Predicado com aridade Aridade Predicado da base de conhecimento
Predicados assert e retract s o podem ser aplicados a

predicados novos ou a predicados j a denidos como dynamic

Manipula c ao da base de conhecimento: exemplo

Ficheiro pai avo.pl

:- dynamic ad/2. ad(jose,rita). ad(jose,joao). ad(luis,jose). avo(X,Y) :- ad(X,Z), ad(Z,Y).

Manipula c ao da base de conhecimento: exemplo

Operador de corte

Predicado cut, denotado !, permite alterar o comportamento

do mecanismo subjacente ao Prolog


Objectivo: reduzir o espa co de procura
Evita que o Prolog siga caminhos que n ao levam a solu co es

merge(Xs,Ys,Zs)

Predicado merge: junta duas listas ordenadas produzindo uma

lista ordenada
merge(Xs,[],Xs). merge([],Ys,Ys). merge([X|Xs],[Y|Ys],[X|Zs]) :X < Y, merge(Xs,[Y|Ys],Zs). merge([X|Xs],[Y|Ys],[X,Y|Zs]) :X =:= Y, merge(Xs,Ys,Zs). merge([X|Xs],[Y|Ys],[Y|Zs]) :X > Y, merge([X|Xs],Ys,Zs).

merge: observa co es

Duas cl ausulas (factos) para casos terminais Tr es cl ausulas (regras) para casos recursivos X < Y, X =:= Y, X > Y merge e determin stico Um objectivo unica com uma u nica cl ausula Logo, uma vez encontrada a cl ausula com que unica n ao vale a pena tentar unicar com outras cl ausulas

mergeC: com corte

Usar operador de corte ! mergeC(Xs,[],Xs) :- !. mergeC([],Ys,Ys) :- !. mergeC([X|Xs],[Y|Ys],[X|Zs]) :X < Y, !, mergeC(Xs,[Y|Ys],Zs). mergeC([X|Xs],[Y|Ys],[X,Y|Zs]) :X =:= Y, !, mergeC(Xs,Ys,Zs). mergeC([X|Xs],[Y|Ys],[Y|Zs]) :X > Y, !, mergeC([X|Xs],Ys,Zs). Operador de corte na segunda e na u ltima cl ausula n ao tem efeitos pr aticos

merge: exemplo

Operador de corte: sem antica

Se o objectivo anterior ao corte e satisfeito ent ao cl ausulas

unicadas posteriormente a ` unica ca o da cabe ca da cl ausula onde ocorre o corte s ao eliminadas da procura
Exemplo: objectivo ?- mergeC([1,3,5],[2,3],Xs)
S ao eliminados da procura os n os correspondentes a 1=:=2,!,mergeC([3,5],[3],Xs1) e a 1>2,!,mergeC([1,3,5],[3],Xs1)

De um modo geral, se tivermos uma cl ausula

r :- p1 ,..., pm ,!,q1 ,..., qn ent ao se o corte for atingido n ao ser ao consideradas:


Alternativas a p1 ,..., pm Alternativas a r

Independentemente do que acontecer a q 1 ,..., qn

Operador de corte: sem antica (cont.)

Consequ encias do operador de corte Um corte elimina todas as cl ausulas que aparecem abaixo da cl ausula onde ocorre o corte Um corte elimina solu co es alternativas ` a conjun c ao de objectivos que aparecem ` a sua esquerda
Uma conjun ca o de objectivos seguida de um corte produzir a no m aximo uma solu ca o

Um corte n ao afecta os objectivos ` a sua direita


Estes objectivos podem produzir mais do que uma solu ca o no caso de retrocesso; caso estes objectivos falhem a procura segue a partir da u ltima alternativa anterior a ` cl ausula contendo o corte

minimum(X,Y,Min)

Min corresponde ao menor n umero de X e Y

minimum(X,Y,X) :- X <= Y, !. minimum(X,Y,Y) :- X > Y, !.

split5(Xs,Ys,Zs)

split5 cria duas lista a partir de uma lista de inteiros - uma

lista com os elementos <5 e outra com os elementos 5


split5([],[],[]). split5([H|T],[H|L],R) :- H<5, !, split5(T,L,R). split5([H|T],L,[H|R]) :- H>=5, split5(T,L,R).

split(Xs,Ys,Zs): alternativa

Compara ca o na terceira cl ausula e desnecess aria split5([],[],[]). split5([H|T],[H|L],R) :- H<5, !, split5(T,L,R). split5([H|T],L,[H|R]) :- split5(T,L,R). Terceira cl ausula deixa de ter um signicado por si s o - EVITAR...

Outras utiliza co es do corte

Para acelerar a procura!

isDifferent(A,A) :- !, fail. isDifferent( , ).


isDifferent(A,B) e verdadeiro se A e B n ao unicam

Tipos de cortes

Cortes verdes N ao alteram a l ogica do programa


Exemplos anteriores

Cortes vermelhos Alteram a l ogica do programa


N ao devem ser utilizados!

Cortes vermelhos: exemplo

Alteram a l ogica do programa

p :- a,b. p :- c.
Signica ((a b ) c ) p

p :- a,!,b. p :- c.
Signica ((a b ) (a c )) p

Nega c ao

Operador not est a denido na linguagem Vers oes mais recentes utilizam \+ not corresponde a ` implementa ca o

not(A) :- A,!,fail. not( ).


not(A) e verdadeiro se n ao pudermos mostrar que A e falso \+ <termo> e verdadeiro se n ao for poss vel provar <termo> Nega ca o por falha: assume que o mundo e fechado, ou seja,

que tudo o que e verdadeiro pode ser inferido

Nega c ao: exemplo

boaAlimentacao(cantinaIST). boaAlimentacao(restauranteXPTO). caro(restauranteXPTO). bomNegocio(R) :- boaAlimentacao(R), \+ caro(R). ?- bomNegocio(X). X = cantinaIST

Nega c ao: outro exemplo alterado

bomNegocio(R) :- \+ caro(R), boaAlimentacao(R). ?- bomNegocio(X). No Prolog come ca por tentar encontrar R tal que caro(R) e verdadeiro \+ caro(R) falha se existem restaurantes caros

Nega c ao: exemplo alterado

Assumindo que caro/1 foi declarado como dynamic retract(caro(restauranteXPTO)). ?- bomNegocio(X). X = cantinaIST; X = restaurante(XPTO)

Ordena c ao por gera c ao e teste

Ordena(Xs,Ys) e verdadeiro se Ys corresponder a uma lista

ordenada obtida a partir de Xs Sugest ao


Usar predicado para permuta co es (perm(Xs,Ys)) denido anteriormente Denir predicado que verica se uma lista est a ordenada (ordenada(Xs))

Ordena c ao: predicado ordenada

ordenada([]). ordenada([ ]). ordenada([X,Y|Ys]) :- X=<Y, ordenada([Y|Ys]).

Ordena c ao por gera c ao e teste

ordena(Xs,Ys) :- perm(Xs,Ys), ordenada(Ys).

Ordena c ao: insertion sort

Um elemento (tipicamente o primeiro) e removido da lista O resto da lista e ordenada recursivamente O elemento removido e inserido de uma forma ordenada

Ordena c ao: predicado insert

insert(X,[],[X]). insert(X,[Y|Ys],[Y|Zs]) :- X > Y, !, insert(X,Ys,Zs). insert(X,[Y|Ys],[X,Y|Ys]) :- X =< Y.

Ordena c ao: insertion sort

insertion-sort([X|Xs],Ys) :- insertion-sort(Xs,Zs), !, insert(X,Zs,Ys). insertion-sort([],[]).

Torres de Hanoi

Existem 3 pinos (A,B,C) e um conjunto de discos com

di ametros diferentes
Estado inicial: todos os discos no pino A em ordem

decrescente de di ametro de baixo para cima


Estado nal: todos os discos no pino B na mesma ordem Regra: um disco n ao pode car por cima de um disco mais

pequeno

Torres de Hanoi: motiva c ao

Dividir o problemas de mover n discos de A para B em

sub-problemas
Mover n-1 discos para C Mover n- esimo disco para B Usar os mesmos movimentos AC para CB

Torres de Hanoi: predicado hanoi

para(Pino1,Pino2) representa o movimento da pe ca que

est a no topo do Pino1 para o topo do Pino2 hanoi(N,A,B,C,Movs,[]) e verdadeiro se Movs e um sequ encia de movimentos que permitem mover N discos do pino A para o pino B usando o pino C como auxiliar de acordo com as regras estabelecidas
Ultimo argumento guarda solu c ao parcial Condi ca o de paragem hanoi(1,A,B, ,[para(A,B)|Zs],Zs).

Torres de Hanoi: predicado hanoi (cont.)

hanoi(N,A,B,C,Xs,Zs):N>1, N1 is N - 1, hanoi(N1,A,C,B,Xs,[para(A,B)|Ys]), hanoi(N1,C,B,A,Ys,Zs).

Torres de Hanoi: exemplo

Problema dos mission arios e canibais

Existem 3 mission arios e 3 canibais na margem esquerda de

um rio
O objectivo e transport a-los para a margem direita Existe um barco para os transportar de uma margem para a

outra que pode levar no m aximo duas pessoas de cada vez


Para um barco se deslocar tem de ter pelo menos um passageiro O n umero de canibais numa margem n ao pode exceder o

n umero de mission arios na mesma margem, caso contr ario...

Mission arios e canibais: estruturas de dados

estado(<MissionariosEsq>,<CanibaisEsq>,<MargemBarco>) Estado inicial: estado(3,3,esq) Estado nal: estado(0,0,dir) Solu ca o: lista de estados inicializada com o estado inicial V ao sendo adicionados novos estados ` a cabe ca da lista No nal e necess ario inverter a lista para obter a solu c ao

Mission arios e canibais: predicado resolve canibal

Predicado

resolve canibal(<SolucaoParcial>,<Solucao>)
Condi ca o de paragem: resolve canibal([estado(0,0,dir)|EstadosAnt], [estado(0,0,dir)|EstadosAnt]) :- !. Objectivo canibal :resolve canibal([estado(3,3,esq)],Solucao), inverte(Solucao,SolucaoOrdenada), mostra estados(SolucaoOrdenada).

Mission arios e canibais: predicado inverte

inverte(Lista,Solu ca ~o) :- inverte(Lista,[],Solu ca ~o). inverte([],Lista,Lista). inverte([X|Cauda],Res,Lista) :inverte(Cauda,[X|Res],Lista).

Mission arios e canibais: observa co es

Combina co es poss veis para passageiros do barco (0,1),(1,0),(1,1),(0,2),(2,0) Transi ca o entre estados em fun ca o dos passageiros do barco Por exemplo, a partir do estado(3,3,esq) n ao e poss vel transitar para o estado(3,0,dir) Combina co es poss veis para mission arios/canibais na margem

esquerda
(3, ),( ,0),(N,N) o que corresponde a (0, ),( ,3),(M,M) na margem direita, respectivamente N ao e poss vel ter (2,1) na margem esquerda (implicaria (1,2) na margem direita) N ao permitir ciclos/estados repetidos

Mission arios e canibais: predicado resolve canibal

resolve canibal([estado(M1,C1,esq)|EstadosAnt],Solucao) :membro([M,C],[[0,1],[1,0],[1,1],[0,2],[2,0]]), M1 >= M,C1 >= C, M2 is M1 - M, C2 is C1 - C, membro([M2,C2],[[3, ],[0, ],[N,N]]), \+ membro(estado(M2,C2,dir),EstadosAnt), resolve canibal([estado(M2,C2,dir), estado(M1,C1,esq)| EstadosAnt],Solucao).

Mission arios e canibais: predicado resolve canibal (cont.)

resolve canibal([estado(M1,C1,dir)|EstadosAnt],Solucao) :membro([M,C],[[0,1],[1,0],[1,1],[0,2],[2,0]]), 3 - M1 >= M, 3 - C1 >= C, M2 is M1 + M, C2 is C1 + C, membro([M2,C2],[[3, ],[0, ],[N,N]]), \+ membro(estado(M2,C2,esq),EstadosAnt), resolve canibal([estado(M2,C2,esq), estado(M1,C1,dir)|EstadosAnt],Solucao).

Mission arios e canibais: predicado membro

membro(X,[X| ]). membro(X,[ |Y]) :- membro(X,Y).

Mission arios e canibais: solu c ao

Arvores bin arias

Estruturas de dados recursivas que servem de base a muitos

algoritmos
Cada a rvore e caracterizada por tr es elementos 1. Raiz 2. Arvore esquerda 3. Arvore direita Representa ca o em Prolog Arvore vazia: void Arvore n ao vazia: tree(Root,Left,Right)

Deni c ao de arvores bin arias

Predicado binary tree(Tree) e verdadeiro se Tree for uma

a rvore bin aria


binary tree(void). binary tree(tree( ,Left,Right)) :binary tree(Left),binary tree(Right).

Convers ao de listas para arvores bin arias

Predicado list to tree(List,Tree) e verdadeiro se Tree

corresponde a `a rvore bin aria representada em List


Exemplo list to tree([4,[5,[],[]],[6,[],[]]], tree(4,tree(5,void,void),tree(6,void,void)). list to tree([],void). list to tree([Root,Left,Right],tree(Root,TL,TR)) :list to tree(Left,TL),list to tree(Right,TR).

Elemento membro de uma arvore

Predicado tree member(Elem,Tree) e verdadeiro se Elem e

um elemento da a rvore bin aria Tree


tree member(X,tree(X, , )) :- !. tree member(X,tree( ,Left, )) :tree member(X,Left), !. tree member(X,tree( , ,Right)) :- tree member(X,Right).

Sub- arvore

Predicado subtree(Subtree,Tree) e verdadeiro se Subtree

e uma sub- arvore da a rvore bin aria Tree


subtree(T,T) :- !. subtree(S,tree( ,L, )):- subtree(S,L), !. subtree(S,tree( , ,R)):- subtree(S,R).

Soma dos elementos

Predicado sum tree(S,Tree) e verdadeiro se S e a soma dos

elementos da a rvore bin aria Tree


sum tree(void,0). sum tree(tree(X,L,R),S):sum tree(L,S1), sum tree(R,S2), S is X+S1+S2.

Arvores isom orcas


Duas a rvores isom orcas

Duas a rvores n ao isom orcas

Arvores isom orcas

Predicado isotree(Tree1,Tree2) e verdadeiro se Tree1 e

Tree2 s ao a rvores isom orcas, ou seja, Tree1 pode ser obtida a partir de Tree2 reordenando os ramos das sub- arvores
isotree(void,void). isotree(tree(X,Left1,Right1),tree(X,Left2,Right2)) :isotree(Left1,Left2),isotree(Right1,Right2). isotree(tree(X,Left1,Right1),tree(X,Left2,Right2)) :isotree(Left1,Right2),isotree(Right1,Left2).

Substitui c ao de um elemento

Predicado substitute(Elem1,Elem2,Tree1,Tree2) se a

a rvore Tree2 corresponde a `a rvore Tree1 substitutindo Elem1 por Elem2


substitute( , ,void,void). substitute(X,Y,tree(Root,Left,Right), tree(Root1,Left1,Right1)) :replace(X,Y,Root,Root1), substitute(X,Y,Left,Left1), substitute(X,Y,Right,Right1).

Substitui c ao de um elemento (cont.)

Predicado

replace(OldWhat,NewWhat,OldWhere,NewWhere) e verdadeiro se NewWhere corresponde a OldWhere em que OldWhat foi substitu do por NewWhat
replace(X,Y,X,Y). replace(X, ,Z,Z) :- X =\= Z.

Arvores bin arias ordenadas: exemplo

Ordena c ao da arvore

Predicado ordered tree(Tree) e verdadeiro se Tree for

uma a rvore ordenada, ou seja, se para todos os n os da a rvore, necessariamente diferentes, se verica que todos os n os que est ao na sub- arvore esquerda de um dado n o s ao menores do que esse n o e todos os n os que est ao na sub- arvore direita s ao maiores do que esse n o
ordered tree(void). ordered tree(tree(X,L,R)):ordered left(X,L), ordered right(X,R).

Ordena c ao da arvore (cont.)

ordered left( ,void). ordered left(X,tree(Y,L,R)):X>Y, ordered tree(tree(Y,L,R)), ordered tree(tree(X,R,void)).

Ordena c ao da arvore (cont.)

ordered right( ,void). ordered right(X,tree(Y,L,R)):X < Y, ordered tree(tree(Y,L,R)), ordered tree(tree(X,void,L)).

Inser c ao de um elemento numa arvore ordenada

Predicado tree insert(X,Tree,Tree1) e verdadeiro se

Tree1 resulta da inser ca o do elemento X na a rvore ordenada Tree


tree insert(X,void,tree(X,void,void)). tree insert(X,tree(X,L,R),tree(X,L,R)) :- !. tree insert(X,tree(Y,L,R),tree(Y,L1,R)):X < Y, !, tree insert(X,L,L1). tree insert(X,tree(Y,L,R),tree(Y,L,R1)):X > Y, !, tree insert(X,R,R1).

Elemento membro de uma arvore ordenada

Predicado ordered tree member(X,Tree) e verdadeiro se o

elemento X pertence a `a rvore ordenada Tree


ordered tree member(X,tree(X, , )) :- !. ordered tree member(X,tree(Y,L, )) :- X < Y, !, ordered tree member(X,L). ordered tree member(X,tree(Y, ,R)) :- X > Y, !, ordered tree member(X,R).

Elemento m aximo de uma arvore ordenada

Predicado ordered tree max element(Tree,X) e

verdadeiro se X corresponde ao m aximo elemento da a rvore ordenada Tree


ordered tree max element(tree(X, ,void),X) :- !. ordered tree max element(tree( , ,R),X) :ordered tree max element(R,X).

Ordena c ao in order

Predicado in order(Tree,List) e verdadeiro se List e

obtida atrav es de uma travesia da a rvore em que a a rvore esquerda aparece primeiro, seguida da raiz e da a rvore direita
in order(T,L):-in order(T,L,[]). in order(void,Xs,Xs). in order(tree(X,L,R),Xs,Zs):in order(L,Xs,[X|Ys]), in order(R,Ys,Zs).

Ordena c ao in order: exemplo

Ordena c ao pre order

Predicado pre order(Tree,List) e verdadeiro se List e

obtida atrav es de uma travesia da a rvore em que a raiz aparece primeiro, seguida da a rvore esquerda e da a rvore direita
pre order(T,L):-pre order(T,L,[]). pre order(void,Xs,Xs). pre order(tree(X,L,R),[X|Xs],Zs):pre order(L,Xs,Ys), pre order(R,Ys,Zs).

Ordena c ao post order

Predicado post order(Tree,List) e verdadeiro se List e

obtida atrav es de uma travesia da a rvore em que a a rvore esquerda aparece primeiro, seguida da a rvore direita e da raiz
post order(T,L):-post order(T,L,[]). post order(void,Xs,Xs). post order(tree(X,L,R),Xs,Zs):post order(L,Xs,Ys), post order(R,Ys,[X|Zs]).

Você também pode gostar