Escolar Documentos
Profissional Documentos
Cultura Documentos
L ogica para Programa ca o LEIC - Tagus Park 1o Semestre, Ano Lectivo 2007/08 c In es Lynce
Bibliograa
Cambridge, 2007.
Martins J.P., Prolog, Cap tulo 5. Ben-Ari M., Mathematical Logic for Computer Science,
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
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
Correspondem a cl ausulas de Horn que consistem num literal positivo Terminam com ponto nal (.)
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).
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).
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)
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
e que t em de ser
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)).
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
house(Nationality,Pet,Smokes,Drinks,Colour)
Representa ca o da la de casas (designada Houses)
(H1,H2,H3,H4,H5)
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
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)).
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, , , , )).
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)).
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
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
Listas
, , , , ,
, , , , ,
, , , , ,
, , , , ,
), ), ), ), )]).
Acrescentar ao objectivo
houses(House)
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).
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)
soma([],0). soma([Cabeca|Cauda],N) :-
soma(Cauda,M), N is M+Cabeca.
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)
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)
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
remove(El,[1,2,3],Res).
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) 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)
No
remove(El,[2,3],Cauda2)
remove(El,[3],Cauda22)
remove(El,[],Cauda23)
Permuta c ao de listas
[5,3,1,7,2,8,6,4]
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).
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
bagof|setof|findall(<Objecto>,<Objectivo>,<Res>)
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]
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
Operador de corte
merge(Xs,Ys,Zs)
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
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
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)
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
minimum(X,Y,Min)
split5(Xs,Ys,Zs)
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...
Tipos de cortes
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
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
Assumindo que caro/1 foi declarado como dynamic retract(caro(restauranteXPTO)). ?- bomNegocio(X). X = cantinaIST; X = restaurante(XPTO)
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
Torres de Hanoi
di ametros diferentes
Estado inicial: todos os discos no pino A em ordem
pequeno
sub-problemas
Mover n-1 discos para C Mover n- esimo disco para B Usar os mesmos movimentos AC para CB
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).
um rio
O objectivo e transport a-los para a margem direita Existe um barco para os transportar de uma margem para a
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
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).
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
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).
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).
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)
Sub- arvore
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
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.
Ordena c ao da arvore
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).
ordered right( ,void). ordered right(X,tree(Y,L,R)):X < Y, ordered tree(tree(Y,L,R)), ordered tree(tree(X,void,L)).
Ordena c ao in order
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).
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).
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]).