algoritmia avancada tp prolog

Upload: ivan-da-fonseca

Post on 11-Jul-2015

89 views

Category:

Documents


0 download

TRANSCRIPT

Origem do PROLOGA Linguagem PROLOG foi criada nos anos 70 por Alain Colmareur, na Universidade de Marselha O nome da linguagem vem de PROgramming in LOGic, ou seja, segue o paradigma da Programao em Lgica conjuntamente com a linguagem LISP, criada nos anos 50, uma das linguagens especficas para o desenvolvimento de Sistemas de Inteligncia Artificial Enquanto que a linguagem LISP teve impacto nos EUA, o PROLOG alcanou notoriedade na Europa e no Japo O principal standard de PROLOG foi proposto em Edimburgo, por Clocksin & MellishAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

1

Lgica e PROLOGA linguagem PROLOG usa o Princpio da Resoluo para a Prova de Teoremas, onde a soluo de problemas encontrada directamente por um conjunto de Axiomas ou indirectamente atravs da Inferncia Lgica A Prova de Teoremas segue a Pesquisa Primeiro em Profundidade, na tentativa de provar o teorema, a este mecanismo acrescenta-se o retorno atrs quando ocorre falha (backtracking) As variveis podem residir num de dois estados: no instanciadas ou instanciadas, quando encontrada uma soluo podem ser exibidas as instanciaes possveis Quando algo no est explicitamente definido como um axioma assumido como sendo falso (Assumpo do Mundo Fechado). H vrias extenses ao PROLOG que assumem uma lgica tri-valor (verdadeiro, falso ou desconhecido) Em PROLOG possvel criar/remover dinamicamente axiomasAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

2

Conceitos Bsicos do PROLOGEm PROLOG temos 3 conceitos bsicos: Factos correspondem a axiomas um tipo das clusulas do PROLOG devem ser colocados no ficheiro da Base de Conhecimentop.ex.: rio(douro). pai(pedro,ana).

Regras correspondem a implicaes outro tipo das clusulas do PROLOG devem ser colocadas no ficheiro da Base de Conhecimentop. ex.: neto(N,A):-filho(N,P),(descendente(P,A,_);descendente(P,_,A)).

Questes permitem interrogar a Base de Conhecimento, a partir da consola, o prompt ?as respostas correspondem a solues possveisp.ex.: ?-pai(P,ana). ?-neto(rui,A).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

3

FactosUm facto tem 1 functor (nome genrico do facto, comeado por uma minscula), geralmente tm um ou mais argumentos, englobados por parntesis e separados por vrgulas, e termina com um ponto (o finalizador do PROLOG). Podero no existir argumentos. Os argumentos so geralmente tomos (valores constantes, nmeros ou strings comeadas por minsculas ou entre ), podendo ser tambm variveis (comeadas por uma maiscula).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

4

Exemplos de Factos casados(rui,isabel).Functor: casados Argumentos: 2 tomos rui e isabel Terminador: .

ligado.Functor: ligado Argumentos: nenhum Terminador: .

potncia(X,0,1).Functor: potncia Argumentos: 3 uma varivel e 2 valores numricos Terminador: .Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

5

Uma Base de Conhecimento com factosfica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

6

Questes sobre a Base de Conhecimentofica(porto,portugal). falha fica(lisboa,portugal). falha fica(coimbra,portugal). falha fica(caminha,portugal). falha fica(madrid,espanha). sucesso fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense). falha falha falha falha falha falha ?-fica(madrid,espanha). yes

?-passa(mondego,coimbra). no

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

7

Usando variveis nas questes sobre a Base de Conhecimentofica(porto,portugal). falha fica(lisboa,portugal). falha fica(coimbra,portugal). falha fica(caminha,portugal). falha fica(madrid,espanha). sucesso fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). falha passa(douro,zamora). falha passa(tejo,lisboa). sucesso passa(tejo,toledo). passa(minho,caminha). passa(minho,orense). ?-fica(X,espanha). X=madrid yes ?- passa(tejo,C). C=lisboa yes ?-fica(X,Y). X=porto Y=portugal yes

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

8

Questes sobre a Base de Conhecimento pedindo alternativas com ;fica(porto,portugal). falha fica(lisboa,portugal). falha fica(coimbra,portugal). falha fica(caminha,portugal). falha fica(madrid,espanha). sucesso fica(barcelona,espanha). sucesso fica(zamora,espanha). sucesso fica(orense,espanha). sucesso fica(toledo,espanha). sucesso passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

?-fica(X,espanha). X=madrid ; X=barcelona ; X=zamora ; X=orense ; X=toledo yes

9

Questes sobre a Base de Conhecimento pondo as alternativas numa listafica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). falha falha falha falha sucesso sucesso sucesso sucesso sucesso

?-findall(X,fica(X,espanha),L). L=[madrid,barcelona,zamora,orense,toledo] yesAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

10

Questes sobre a Base de Conhecimento com conjuno (, na questo)fica(porto,portugal). sucesso fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). sucesso passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense). ?-fica(X,portugal),passa(R,X). X=porto R=douro

yes

E se fossem pedidas alternativas com o ; ? ?-fica(X,portugal),passa(R,X). X=porto R=douro ; X=lisboa R=tejo ; X=caminha R=minho

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

11

Questes sobre a Base de Conhecimento com disjuno (; na questo)fica(porto,portugal). sucesso fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense). ?-fica(X,portugal);fica(X,espanha). X=porto

yesE se fossem pedidas alternativas com o ; ? ?-fica(X,portugal);fica(X,espanha). X=porto ; X=lisboa ; X=coimbra ; X=caminha ; X=madrid ; X=barcelona ; X=zamora ; X=orense ; X=toledo

yesAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

12

Questes sobre a Base de Conhecimento com negao (not)fica(porto,portugal). sucesso fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense). falha falha falha falha falha falha13

?-not fica(porto,portugal). no ?-not passa(mondego,coimbra). yes

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

RegrasUma regra tem 1 termo (functor e argumentos) do lado esquerdo que corresponde a aquilo que se pretende provar (concluso), seguido do :-. direita afectados controlo. condies do :- podem aparecer outros termos por operadores (, ; not) e por primitivas de No fundo o lado direito corresponde s da regra.

Tal como nos factos, podemos ter regras com o mesmo nome e mesmo n de argumentos, ou at com o mesmo nome e n de argumentos diferentes.

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

14

Exemplos de Regrasfilho(X,Y):-homem(X),(descendente(X,Y,_);descendente(X,_,Y)). Assume-se que descendente(A,B,C) indica que A filho do pai B e da me C A regra deve ser lida do seguinte modo: SE X homem E (X descendente do seu pai Y OU X descendente da sua me Y) ENTO X filho de Y O _ corresponde a uma varivel da qual no necessitamos o valor potncia(_,0,1):-!. potncia(X,N,P):- N1 is N-1,potncia(X,N1,P1),P is X*P1. Esta uma definio recursiva da potncia inteira e no negativa de um n A recursividade muito comum nas regras do PROLOG O ! (cut) uma primitiva de controlo que ser explicada posteriormenteAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

15

Acrescentando regras Base de Conhecimentofica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense).

rio_portugus(R):-passa(R,C),fica(C,portugal). banhadas_mesmo_rio(C1,C2):-passa(R,C1),passa(R,C2),C1\==C2.Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

16

Questes sobre a Base de Conhecimento com Regrasfica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense). sucesso (2)

?-rio_portugus(Rio). Rio=douro yes Note-se que:na chamada regra, do lado esquerdo, Rio e R passam a ser a mesma varivel; passa(R,C) tem sucesso com R=douro e C=porto; a chamada seguinte j feita com C j instanciada com porto, na prtica essa chamada feita como sendo fica(porto,portugal) Quando se atinge o ponto a regra tem sucesso

sucesso (1)

rio_portugus(R):-passa(R,C),fica(C,portugal).

banhadas_mesmo_rio(C1,C2):-passa(R,C1),passa(R,C2),C1\==C2.

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

17

Questes sobre a Base de Conhecimento com Regrasfica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense). falha sucesso (2)

?-rio_portugus(tejo). yes Note-se que: na chamada regra, do lado esquerdo, R fica instanciada com o valor tejo; dentro da regra (lado direito) a 1 chamada j feita como sendo passa(tejo,C) e tem sucesso com R=tejo e C=lisboa; a chamada seguinte j feita com C j instanciada com lisboa, na prtica essa chamada feita como sendo fica(lisboa,portugal) Quando se atinge o ponto a regra tem sucesso

falha falha sucesso (1)

rio_portugus(R):-passa(R,C),fica(C,portugal).

banhadas_mesmo_rio(C1,C2):-passa(R,C1),passa(R,C2),C1\==C2.

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

18

Questes sobre a Base de Conhecimento com Regrasfica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,toledo). passa(tejo,lisboa). passa(minho,caminha). passa(minho,orense). E se trocarmos os factos do rio tejo? falha falha falha sucesso (3) ?-rio_portugus(tejo). falha yes falha na chamada regra, do lado esquerdo, R fica falha instanciada com o valor tejo; falha dentro da regra (lado direito) a 1 chamada falha j feita como sendo passa(tejo,C) e tem sucesso com R=tejo e C=toledo; falha falha a chamada seguinte j feita com C j falha falha sucesso (1) sucesso (2)instanciada com toledo, na prtica essa chamada feita como sendo fica(toledo,portugal) e falha Volta-se atrs (backtracking) e tentada uma nova soluo para passa(tejo,C), ficando C=lisboa a chamada seguinte j feita com C j instanciada com lisboa, na prtica essa chamada feita como sendo fica(lisboa,portugal) Quando se atinge o ponto a regra tem sucesso

rio_portugus(R):-passa(R,C),fica(C,portugal).

banhadas_mesmo_rio(C1,C2):-passa(R,C1),passa(R,C2),C1\==C2.Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

19

Questes sobre a Base de Conhecimento com Regrasfica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). ?-banhadas_mesmo_rio(C1,C2). C1=porto C2=zamora yes

Note-se que: na chamada regra, do lado esquerdo, C1 e C2 continuam como sendo no instanciadas; dentro da regra (lado direito) a 1 chamada j feita como sendo passa(R,C1) e tem sucesso com R=douro e C1=porto; a chamada seguinte j feita com R j suc.(1) suc.(2) instanciada com douro, na prtica essa passa(douro,porto). passa(douro,zamora). suc.(3) chamada feita como sendo passa(douro,C2) e tem sucesso com C2=porto passa(tejo,lisboa). O teste seguinte falha (porto no diferente passa(tejo,toledo). de porto) e faz-se o backtracking passa(minho,caminha). Agora passa(douro,C2) tem sucesso com passa(minho,orense). C2=zamora O teste seguinte tem sucesso (porto rio_portugus(R):-passa(R,C),fica(C,portugal). diferente de zamora) Quando se atinge o ponto a regra tem sucesso

banhadas_mesmo_rio(C1,C2):-passa(R,C1),passa(R,C2),C1\==C2.

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

20

Questes sobre a Base de Conhecimento com Regrasfica(porto,portugal). fica(lisboa,portugal). fica(coimbra,portugal). fica(caminha,portugal). fica(madrid,espanha). fica(barcelona,espanha). fica(zamora,espanha). fica(orense,espanha). fica(toledo,espanha). passa(douro,porto). passa(douro,zamora). passa(tejo,lisboa). passa(tejo,toledo). passa(minho,caminha). passa(minho,orense).

Experimente fazer as seguintes questes e efectue as traagens ?-banhadas_mesmo_rio(orense,C). ?-banhadas_mesmo_rio(C,lisboa). ?-banhadas_mesmo_rio(zamora,porto). ?-banhadas_mesmo_rio(lisboa,porto). ?-banhadas_mesmo_rio(coimbra,C).

rio_portugus(R):-passa(R,C),fica(C,portugal). banhadas_mesmo_rio(C1,C2):-passa(R,C1),passa(R,C2),C1\==C2.

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

21

Variveis em PROLOGAs variveis em PROLOG tm um desempenho diferente das variveis de outras linguagens Em PROLOG uma varivel pode estar apenas em dois estados: no instanciada ou instanciada Uma vez instanciada uma varivel s pode mudar de valor pelo processo de backtracking, ou seja, voltando a ficar como no instanciada para tomar outro valorExemplos: No acetato 19, C tomou o valor toledo e depois por backtracking passou a tomar o valor lisboa no acetato 20, C2 tomou o valor porto e depois por backtracking passou a tomar o valor zamoraAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

22

Variveis em PROLOGEm PROLOG o incremento duma varivel nunca pode ser feito como N is N+1 (is a atribuio numrica)Se N no estiver instanciado ocorre uma falha quando se tenta avaliar N+1 Se N estiver instanciado no poderemos obrigar a mudar o seu valor Deve ser usado N1 is N+1

Se for pedida a impresso de uma varivel no instanciada aparecer um n antecedido de _ (por exemplo _22456) que tem a ver com a referncia da varivel e no com o seu valor Quando num facto ou regra no interesse o valor de uma varivel, esta pode ser substituda por _ Se quisermos saber se uma varivel est ou no instanciada devemos usar:var(X) tem sucesso se X no estiver instanciada; nonvar(X) tem sucesso se X estiver instanciadaAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

23

Variveis em PROLOG Vejamos atravs da interaco com a consola o modo de funcionamento de uma varivel?- write('X='),write(X),nl,X=a,write('X='),write(X),nl. X=_22650 X=a X=a ?- write('X='),write(X),nl,X=a,write('X='),write(X),nl,X=b. X=_39436 X=a no

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

24

Operadores Lgicos em PROLOGJ foi visto que os operadores lgicos em PROLOG eram:, para a conjuno ; para a disjuno not para a negao

Podemos usar os () para tirar ambiguidades ou forar as expresses pretendidas Vamos considerar a seguinte base de factos (com factos sem argumentos):a. b. c:-fail. /*o fail origina uma falha*/ d.Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

25

Operadores Lgicos em PROLOGBase de Factos Questes:?- a. yes ?- c. no ?- not a. no ?- not c. yes ?- a,b. yes ?- a,c. no ?- a;c. yes ?- (a,c);(not a;b). yes26

a. b. c:-fail. d.

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

Operadores Aritmticos em PROLOG Os operadores aritmticos do PROLOG so:+ adio X+Y - Subtrao X-Y * Multiplicao X*Y / diviso X/Y // diviso inteira X//Y mod resto da diviso inteira X mod Y ^ Potncia X^Y - Simtrico -X

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

27

Funes Aritmticas em PROLOGEmbora a linguagem PROLOG no seja a mais adequada para clculo numrico, como em qualquer outra linguagem temos funes aritmticas, alguns exemplos do LPA-PROLOG:abs(X) acos(X) aln(X) alog(X) asin(X) atan(X) cos(X) fp(X) int(X) valor absoluto de X arco-cosseno de X (graus) ex 10x arco-seno de X (graus) arco-tangente de X (graus) cosseno de X (graus) parte no inteira de X (mesmo sinal que X) inteiro igual ou imediatamente anterior a X28

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

Funes Aritmticas em PROLOGip(X) ln(X) log(X) max(X,Y) min(X,Y) rand(X) sign(X) sin(X) sqrt(X) tan(X) parte inteira de X logaritmo natural de X logaritmo decimal de X mximo entre X e Y mnimo entre X e Y gera um nmero aleatrio entre 0 e X (vrgula flutuante) sinal de X (-1 se negativo, 0 se zero ou 1 se positivo) seno de X (graus) raiz quadrada de X tangente de X (graus)29

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

Operadores Relacionais em Prolog Os operadores relacionais do PROLOG so:== igualdade X==Y \== diferena X\==Y > maior X>Y < menor X= Y

Convm atender ao facto das variveis poderem estar instanciadas ou noAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

30

Operadores Relacionais em PROLOG?- X=a,Y=a,X==Y. X=Y=a ?- X=a,Y=b,X==Y. no ?- X=a,X==Y. no ?- X=a,Y=b,X\==Y. X=a, Y=b ?- X=a,X\==Y. X=a, Y=_Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

?- X==Y. no ?- X\==Y. X=_, Y=_ ?- X=Y,X==Y. X=Y=_ ?- X=Y,X\==Y. no

31

Atribuio em PROLOG Em PROLOG temos 2 operadores de atribuio= para a atribuio simblica X=a is para a atribuio numrica X is 5

A atribuio simblica bidireccional, para X=Y temos:Se X no est instanciado e Y est ento temos XY Se X est instanciado e Y no est ento temos XY Se nenhum est instanciado ento passam a ser a mesma varivel Se ambos esto instanciados com o mesmo valor ento h sucesso Se ambos esto instanciados com valores diferentes ento ocorre uma falhaAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

32

Atribuio em PROLOG?- X=Y,X=a. X=Y=a ?- Y=a,X=Y. Y=X=a ?- X=a,X=Y. X=Y=a ?- X=Y. X=Y=_ ?- X=a,Y=a,X=Y. X=Y=a ?- X=a,Y=b,X=Y. noAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

33

Atribuio em PROLOG A atribuio numrica unidireccional Do lado direito do is, se estiverem envolvidas variveis, elas devem estar instanciadas Do lado esquerdo a varivel no deve estar instanciada, seno ocorre uma falha Do lado direito as varivel que apaream devem estar instanciadas Em PROLOG N is N+1 nunca tem sucessoAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

34

Escrita em PROLOG A escrita no output stream (normalmente o monitor) feita com o writewrite(hello) escreve hello write(Hello World) escreve Hello World write(Hello) escreve contedo da varivel Hello

Outra possibilidade escrever usando o putput(65) escreve o caracter A (cdigo ASCII 65)

A mudana de linha feita com o nl

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

35

Leitura em PROLOG A leitura do input stream (normalmente o teclado) feita com o readread(X) l o valor de X Deve-se terminar com o . seguido de RETURN

Outra possibilidade ler usando o get ou o get0get(A) l o prximo carcter (no branco, ou seja, ignora CR, TAB, espao) get0(A) - l o prximo carcter?- get(X),get(Y),get(Z). ab c X = 97 , Y = 98 , Z = 99 ?- get0(X),get0(Y),get0(Z). ab X = 97 , Y = 98 , Z = 1336

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

Recursividade O uso da recursividade muito comum na linguagem PROLOG Na implementao de um predicado recursivo devemos ter em ateno que dever haver sempre uma alternativa para finalizar as chamadas recursivasPor uma regra, ou facto, que no efectua essa chamada Por uma das alternativas de uma disjuno

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

37

Recursividadefactorial(0,1):-!. /* a funo do ! ser explicada posteriormente */ factorial(N,F):-N1 is N-1,factorial(N1,F1),F is N*F1. Vejamos o que acontece quando se efectua a chamada ?-factorial(3,F). F=6factorial(0,1) falha factorial(3,F):-N1 3-1,factorial(2,F1) , F is 3*2. sucesso (c/ F 6) factorial(0,1) falha factorial(2,F):-N1 2-1,factorial(1,F1) , F is 2*1. sucesso (c/ F 2) factorial(0,1) falha factorial(1,F):-N1 1-1,factorial(0,F1) , F is 1*1. sucesso (c/ F 1) factorial(0,1):-!. sucesso

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

38

Recursividade Considerando o seguinte programa que resolve o problema das Torres de Hani:hanoi(N):-move(N,e,c,d). move(0,_,_,_):-!. move(N,A,B,C):-M is N-1, move(M,A,C,B), informa(A,B), move(M,C,B,A). informa(A,B):- write('MOVER DISCO DE '), write(A),write(' PARA '),write(B),nl.

Efectue a traagem do que acontece quando se faz a chamada ?-hanoi(3).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

39

Recursividade?- hanoi(3). Suc. hanoi(3):-move(3,e,c,d). Suc. 4 (1) F (2) move(3,e,c,d):-M is 3-1, move(2,e,d,c), informa(e,c), move(2,d,c,e). Suc. (1) F (2) move(2,e,d,c):-M is 2-1, move(1,e,c,d), informa(e,d), move(1,c,d,e). Suc.

Output: 1 2 3 4 5 6 7 e e c e d d e c d d c e c c

2

1 (1) F (2) move(1,e,c,d):-M is 1-1, move(0,e,d,c), informa(e,c), move(0,d,c,e). Suc.(1) move(0,_,_,_):-!. Suc. (1) move(0,_,_,_):-!. Suc.

3 (1) F (2) move(1,c,d,e):-M is 1-1, move(0,c,e,d), informa(c,d), move(0,e,d,c). Suc.(1) move(0,_,_,_):-!. Suc. (1) move(0,_,_,_):-!. Suc.

6 (1) F (2) move(2,d,c,e):-M is 2-1, move(1,d,e,c), informa(d,c), move(1,e,c,d). Suc. 5 (1) F (2) move(1,d,e,c):-M is 1-1, move(0,d,c,e), informa(d,e), move(0,c,e,d). Suc.(1) move(0,_,_,_):-!. Suc. (1) move(0,_,_,_):-!. Suc.

7 (1) F (2) move(1,e,c,d):-M is 1-1, move(0,e,c,d), informa(e,c), move(0,c,d,e). Suc.(1) move(0,_,_,_):-!. Suc. (1) move(0,_,_,_):-!. Suc.

hanoi(N):-move(N,e,c,d). (1) move(0,_,_,_):-!. (2) move(N,A,B,C):-M is N-1, move(M,A,C,B), informa(A,B), move(M,C,B,A). informa(A,B):- write('MOVER DISCO DE '), write(A),write(' PARA '),write(B),nl.

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

40

Estruturas de Controlo do PROLOG Em PROLOG temos 4 estruturas de controlo principais:true tem sempre sucesso fail Falha sempre repeat tem sempre sucesso, quando se volta para trs por backtracking e se passa pelo repeat, este tem sempre sucesso e obriga a ir para a frente ! l-se cut, uma vez atingida uma soluo para o que est antes do ! J no ser possvel voltar para trs (antes do cut) pelo processo de backtracking

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

41

O true Se no existisse em PROLOG o true poderia ser implementado pelo seguinte facto:true.

Vejamos um exemplo onde o true faz sentidocidade1(C):fica(C,P), ((P==portugal,write(C),write( portuguesa), nl);true).

Se no tivssemos o true ocorreria uma falha se C no fosse uma cidade portuguesa, mas o que queremos que tenha sucesso se C for uma cidade e para o caso particular de ser portuguesa deve aparecer uma mensagem escrita indicando issoAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

42

O failO fail obriga ocorrncia de uma falha, til no raciocnio pela negativa Vejamos um exemplo usando o failsem_precedentes(X):-precede(_,X),!,fail. sem_precedentes(_). precede(a,b). precede(a,c). precede(c,d). precede(b,e). precede(f,h). precede(d,h). precede(g,i). precede(e,i).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

43

O repeatSe no existisse em PROLOG, o repeat poderia ser implementado do seguinte modo:repeat. repeat:-repeat.

Vejamos um exemplo usando o repeatread_command(C):-menu,repeat, write('Comando --> '), read(C), (C==continue;C==abort;C==help;C==load;C==save).

menu:- write('Opes:'),nl,nl,write(continue),nl, write(abort),nl, write(help),nl, write(load),nl, write(save),nl,nl.Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

44

O ! (cut)Serve para limitar o retrocesso, uma vez passado o ! No se poder voltar para trs dele pelo processo de backtracking Serve ainda para delimitar a entrada em regras alternativas Permite optimizar os programas evitando que se perca tempo com anlises no necessrias Por vezes muito redutor, levando a que s seja permitida uma nica soluo, quando podem existir vrias O uso adequado do ! uma das maiores dificuldades dos iniciados no PROLOGAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

45

Uma Base de Conhecimento e uma regra com um !a(1). a(2). a(3). b(1,4). b(3,5). c(3,6). c(5,7). c(5,8). d(7,9). d(7,10). d(8,11). e(9,12). e(9,13). e(10,14). e(11,15). e(11,16). r(X,Y,Z,U,V):-a(X),b(X,Y),c(Y,Z),!,d(Z,U),e(U,V).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

46

Uma Base de Conhecimento com uma regra com um !a(1). a(2). a(3). b(1,4). b(3,5). c(3,6). c(5,7). c(5,8). d(7,9). d(7,10). d(8,11). e(9,12). e(9,13). e(10,14). e(11,15). e(11,16). r(X,Y,Z,U,V):a(X),b(X,Y),c(Y,Z),!,d(Z,U),e(U,V).

O que acontecer se colocarmos a questo ?-r(X,Y,Z,U,V). e pedirmos vrias solues?

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

47

Uma Base de Conhecimento com uma regra com um !a(1). a(2). a(3). b(1,4). b(3,5). c(3,6). c(5,7). c(5,8). d(7,9). d(7,10). d(8,11). e(9,12). e(9,13). e(10,14). e(11,15). e(11,16). sucesso sucesso sucesso sucesso falha falha falha falha falha falha falha sucesso falha sucesso

?-r(X,Y,Z,U,V). Ao entrar na regra, chama-se a(X) e X toma o valor 1; feita a chamada b(1,Y) e Y toma o valor 4; feita a chamada c(4,Z) e falha Volta-se atrs por backtracking, mas no h mais solues para b(1,Y) e falha Volta-se atrs por backtracking e a(X) permite que X tome o valor 2 feita a chamada de b(2,Y) e falha Volta-se atrs por backtracking e a(X) permite que X tome o valor 3 feita a chamada b(3,Y) e Y toma o valor 5; feita a chamada c(5,Z) e Z toma o valor 748

r(X,Y,Z,U,V):-a(X),b(X,Y),c(Y,Z),!,d(Z,U),e(U,V).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

Uma Base de Conhecimento com uma regra com um !a(1). a(2). a(3). b(1,4). b(3,5). c(3,6). c(5,7). c(5,8). d(7,9). d(7,10). d(8,11). sucesso sucesso

Neste momento, X=3,Y=5 e Z=7, e passamos pelo !, logo no ser possvel encontrar nenhuma soluo com outros valores de X,Y e Z, visto que foram instanciados antes do !; feita a chamada d(7,U) e U toma o valor 9; feita a chamada e(9,V) e V toma o valor 12; Chegamos ao . e encontramos a 1 soluo:X=3, Y=5, Z=7, U=9, V=12

e(9,12). sucesso(1sol.) e(9,13). e(10,14). e(11,15). e(11,16).

falha falha sucesso(2sol.)

E se pedirmos mais uma soluo com o ; ; tentada uma nova soluo para e(9,V) e V toma o valor 13 Chegamos ao . e encontramos a 2 soluo:X=3, Y=5, Z=7, U=9, V=13

E se pedirmos mais uma soluo com o ; ;r(X,Y,Z,U,V):-a(X),b(X,Y),c(Y,Z),!,d(Z,U),e(U,V).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

49

Uma Base de Conhecimento com uma regra com um !a(1). a(2). a(3). b(1,4). b(3,5). c(3,6). c(5,7). c(5,8). d(7,9). d(7,10). d(8,11). e(9,12). e(9,13). e(10,14). e(11,15). e(11,16). sucesso sucesso falha sucesso(1sol.) sucesso(2sol.) falha falha falha falha falha sucesso(3sol.) falha falha

tentada uma nova soluo para e(9,V) e falha Volta-se atrs por backtracking, e d(7,V) origina uma nova soluo com V=10; feita a chamada e(10,V) e V toma o valor 14; Chegamos ao . e encontramos a 3 soluo:X=3, Y=5, Z=7, U=10, V=14

E se pedirmos mais uma soluo com o ; ; tentada uma nova soluo para e(10,V) e falha Volta-se atrs por backtracking, e d(7,V) falha ; Ao tentar voltar para trs por backtracking, encontra-se o ! e portanto no h mais solues e falha

r(X,Y,Z,U,V):-a(X),b(X,Y),c(Y,Z),!,d(Z,U),e(U,V).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

50

Uma Base de Conhecimento com uma regra com um !a(1). a(2). a(3). b(1,4). b(3,5). c(3,6). c(5,7). c(5,8). d(7,9). d(7,10). d(8,11). e(9,12). e(9,13). e(10,14). e(11,15). e(11,16).

Concluindo: O ! no impediu o backtracking antes dele O ! no impediu o backtracking depois dele Aquilo que o ! impede que o processo de backtracking se extenda de depois do ! para antes do !

Experimente retirar o ! e pedir todas as solues?-r(X,Y,Z,U,V). X=3, Y=5, Z=7, U=9, V=12 ; X=3, Y=5, Z=7, U=9, V=13 ; X=3, Y=5, Z=7, U=10, V=14 ; X=3, Y=5, Z=8, U=11, V=15 ; X=3, Y=5, Z=8, U=11, V=16

r(X,Y,Z,U,V):-a(X),b(X,Y),c(Y,Z),!,d(Z,U),e(U,V).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

51

O ! para evitar a entrada em regras alternativasO ! frequentemente usado para que depois de se atingir o sucesso por uma das alternativas das regras se impea que por backtracking se atinja o sucesso por outra alternativaUm exemplo:potncia(_,0,1). potncia(X,N,P):-N1 is N-1,potncia(X,N1,P1),P is X*P1.

Vejamos o que acontece se forem pedidas vrias solues quando posta a seguinte questo:?- potncia(5,3,P). P = 125 ; Error 2, Local Stack Full, Trying potncia/3 AbortedAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

52

O ! para evitar a entrada em regras alternativasNo exemplo, a falha ocorreu porque depois de se atingir o sucesso pela 1 alternativa (quando o 2 argumento tomou o valor 0) vai-se tentar uma nova soluo pela segunda e o segundo argumento passa a tomar valores negativos (-1,-2,-3,) nos nveis de recursividade que se seguem at que a Stack fica cheia No adianta aumentar a dimenso da Stack A soluo consiste em por um !:potncia(_,0,1):-!. potncia(X,N,P):-N1 is N-1,potncia(X,N1,P1),P is X*P1.

E agora passa a haver apenas uma soluo:?- potncia(5,3,P). P = 125Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

53

ListasEm PROLOG as listas podem ser:No vazias, tendouma cabea (1 elemento da lista) e uma cauda (lista com os restantes elementos)

Vazias, quando no tm nenhum elemento (equivalente ao NULL ou NIL de outras linguagens), uma lista vazia no tem cabea nem cauda

As listas podem ser representadaspela enumerao dos seus elementos separados por vrgulas e envolvidos por [ e ]por exemplo [a,b,c,d]

pela notao cabea-cauda separadas pelo | e envolvidas por [e]por exemplo [H|T]

Em PROLOG os elementos das listas no tm de ser do mesmo tipo (por exemplo, [a,2,abc,[x,1,zzz]])Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

54

Listas[] a lista vazia [a] uma lista com 1 elemento (a) [X] uma lista com 1 elemento (a varivel X) [b,Y] uma lista com 2 elementos (b e a varivel Y) [X,Y,Z] uma lista com 3 elementos (as variveis X,Y e Z) [H|T] uma lista com cabea H e cauda T Vejamos algumas questes PROLOG: ?- [H|T]=[a,b,c,d]. H=a, T = [b,c,d] ?- [H|T]=[a,b,X]. H=a, T = [b,X] , X=_ ?- [H|T]=[a]. H=a, T = [] ?- [H|T]=[[a,b],3,[d,e]]. H = [a,b] , T = [3,[d,e]] ?- [H|T]=[]. noAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

55

O Predicado membro Hoje em dia as implementaes de PROLOG j trazem o predicado member/2 (dois argumentos, aridade 2) que verifica se o primeiro argumento membro da lista do segundo argumento. Mas se esse predicado no existisse poderia ser implementado do seguinte modo:membro(X,[X|_]). membro(X,[_|L]):-membro(X,L).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

56

O Predicado membroVejamos o que acontece quando se pe a questo ?-membro(b,[a,b,c]). yes

membro(X,[X|_]). falha porque X no pode ser ao mesmo tempo b e a membro(b,[a|[b,c]]):-membro(b, [b,c]) . sucesso

membro(b,[b|[c]]). sucesso

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

57

O Predicado membroVejamos o que acontece quando se pe a questo ?-membro(c,[a,b]).

membro(X,[X|_]). falha porque X no pode ser ao mesmo tempo c e a membro(c,[a|[b]]):-membro(c, [b])

membro(X,[X|_]). falha porque X no pode ser c e b membro(c,[b|[ ]]):-membro(c, [ ])

membro(X,[X|_]). falha, [X|_] no instancivel com [ ] membro(c,[_|L]):- falha, [_|L] no instancivel com [ ]

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

58

O Predicado membroContinuando a ver o que acontece ?-membro(c,[a,b]). no membro(X,[X|_]). falhou porque X no pode ser ao mesmo tempo c e a membro(c,[a|[b]]):-membro(c, [b]) falha porque no h mais clusulas possveis membro(X,[X|_]). falhou porque X no pode ser c e b membro(c,[b|[ ]]):-membro(c, [ ]) falha porque no h mais clusulas possveis membro(X,[X|_]). falhou, [X|_] no foi instancivel com [ ] membro(c,[_|L]):- falhou, [_|L] no foi instancivel com [ ]

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

59

O Predicado membroVejamos o que acontece quando se pe a questo ?-membro(X,[a,b,c]). X=a

membro(a,[a|[b,c]]).

sucesso, como X tomou o valor a no 2 argumento, o primeiro argumento tambm fica com o valor a

E se carregarmos em ; tudo se passar como se tivesse ocorrido uma falha e o PROLOG ir tentar a segunda alternativa da clusula

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

60

O Predicado membroContinuao aps pedir nova soluo aps ter dado a primeira soluo X=a ; X=b

membro(a,[a|[b,c]]). falha membro(X,[a|[b,c]]):-membro(X, [b,c]) . sucesso, X tomou o valor b no retorno

membro(b,[b|[c]]). sucesso, como X tomou o valor b no 2 argumento, o primeiro argumento tambm fica com o valor b

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

61

O Predicado membroVejamos ento os possveis resultados das questes: ?- membro(b,[a,b,c]). yes ?- membro(c,[a,b]). no ?- membro(X,[a,b,c]). X=a; X=b; X=c; no ?- membro(a,L). L = [a|_899] ; L = [_49162,a|_49171] ; L = [_49162,_45220,a|_45229]Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

62

O Predicado membro O predicado membro permitiu:Ver se um elemento conhecido pertencia ou no a uma lista de elementos conhecidos (relao de pertena) Seleccionar um elemento de uma lista Gerar uma potencial lista que contenha um elemento

E se trocssemos a ordem das clusulas?membro1(X,[_|L]):-membro1(X,L). membro1(X,[X|_]). Observe-se que agora d-se prioridade visita da cauda da lista, antes de ver qual o elemento que est cabeaAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

63

O Predicado membroA interaco agora seria a seguinte: ?- membro1(b,[a,b,c]). yes ?- membro1(c,[a,b]). no ?- membro1(X,[a,b,c]). X=c; X=b; X=a ?- membro1(a,L). Error 1, Backtrack Stack Full, Trying membro1/2 AbortedAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

64

O Predicado membro A inverso nas clusulas no afectou os dois primeiros exemplos (membro1(b,[a,b,c]) deu yes e membro1(c,[a,b]) deu no). Contudo a nova formulao de membro (membro1) menos eficiente, o que visvel se a lista for longa, por exemplo, membro1(a,[a,b,c,d,e]) ter sucesso, mas ser necessrio visitar todos os elementos da lista at ocorrer uma falha e voltar para trs e nessa altura ver quais so os elementos que esto cabea, falhando sempre at chegar ao 1 nvel, quando ocorre o sucessoAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

65

O Predicado membro No terceiro exemplo (membro1(X,[a,b,c])) visvel que a prioridade dada visita da cauda da lista, as solues so obtidas do final para o princpio da lista O ltimo funcionamento conduz, na prtica, a chamadas recursivas infinitas (s no o so porque a stack estoura) Concluindoapesar de membro1 resolver os casos mais normais, o seu funcionamento no nada eficiente Para o ltimo caso testado, cujo uso no vulgar, o membro1 est mesmo mal concebidoAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

66

O Predicado membro Vamos agora considerar o seguinte programa:teste:- write('A -> '),read(A), write('lista L -> '),read(L), membro2(A,L),A |: [1,2,3,6,3,6,7]. passando por Y= 1 passando por Y= 2 passando por X= 3 yes ?- teste. A -> |: 6. lista L -> |: [1,2,3,6,3,6,7]. passando por Y= 1 passando por Y= 2 passando por Y= 3 passando por X= 6 sucesso pela 1 clusula de membro2, mas falha A |: 6. lista L -> |: [1,2,3,6,3,6,7]. passando por Y= 1 passando por Y= 2 passando por Y= 3 passando por X= 6 noAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

70

O Predicado membroMas vejamos o funcionamento de membro2 como selector de elementos de uma lista: ?- membro2(X,[a,b,c,d]). passando por X= a X=a S obtivemos uma soluo, compare-se com o que se passa com membro: ?- membro(X,[a,b,c,d]). X=a; X=b; X=c; X=d; noAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

71

O Predicado membro Conclumos que:O uso do ! em membro2 permitiu reduzir a ineficincia, pois impediu que retentssemos encontrar o 6 na lista, quando isso no ir alterar nada (continua a no ser menor que 5) Mas o mesmo ! limitou em demasia o processo de retrocesso (como j vimos anteriormente) e levou a que membro2 no funcionasse bem como selector de elementos de uma lista

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

72

O Predicado concatena Hoje em dia as implementaes de PROLOG j trazem o predicado append/3 que junta a lista do 1 argumento com a lista do 2, gerando a lista do 3 argumento. Mas se esse predicado no existisse poderia ser implementado do seguinte modo:concatena([ ],L,L). concatena([A|B],C,[A|D]):-concatena(B,C,D).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

73

O predicado concatenaVamos ver como seria a resposta a questes sobre o concatena ?- concatena([a,b],[c,d,e],L). L = [a,b,c,d,e] ?- concatena(L1,L2,[a,b,c]). L1 = [] , L2 = [a,b,c] ; L1 = [a] , L2 = [b,c] ; L1 = [a,b] , L2 = [c] ; L1 = [a,b,c] , L2 = [] ; noAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

74

O Predicado concatenaVamos ver o que acontece quando se pe a questo: ?-concatena([a,b],[c,d,e],L).

concatena([],L,L). falha concatena([a|[b]],[c,d,e],[a|D]):- concatena([b],[c,d,e],D)

concatena([],L,L). falha concatena([b|[ ]],[c,d,e],[b|D]):- concatena([ ],[c,d,e],D)

concatena([ ], [c,d,e], [c,d,e]). sucessoAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

75

O Predicado concatenaContinuando: ?-concatena([a,b],[c,d,e], [a,b,c,d,e]). L=[a,b,c,d,e]sucesso

concatena([],L,L). falha concatena([a|[b]],[c,d,e],[a|[b,c,d,e]]):-concatena([b],[c,d,e],[b,c,d,e]). sucesso concatena([],L,L). falha concatena([b|[ ]],[c,d,e],[b|[c,d,e]]):- concatena([ ],[c,d,e], [c,d,e]). sucesso concatena([ ], [c,d,e], [c,d,e]). sucesso76

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

O Predicado concatena Vejamos agora o que se passa com as duas primeiras listas no instanciadas e a 3 instanciada?-concatena(L1,L2, [a,b,c]).

concatena([], [a,b,c], [a,b,c]). sucesso

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

77

O Predicado concatena Continuandovendo a 1 soluo:

?-concatena([ ], [a,b,c], [a,b,c]). sucesso L1=[ ] L2=[a,b,c]; concatena([], [a,b,c], [a,b,c]). sucesso

e se carregarmos em ;78

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

O Predicado concatena vai ser gerada uma segunda soluo?-concatena(L1,L2,[a,b,c]). L1=[] L2=[a,b,c] ; sucesso L1=[a] L2=[b,c]; concatena([], L, L). sucesso concatena([a|B], C,[a|[b,c]]):-concatena(B, C, [b,c]).

concatena([], [b,c], [b,c]). sucesso

Vejamos o que acontece quando se voltaAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

79

O Predicado concatena continuando?-concatena([a],[b,c],[a,b,c]). L1=[] L2=[a,b,c] ; L1=[a] L2=[b,c] concatena([], L, L). sucesso concatena([a|[ ]], [b,c],[a|[b,c]]):-concatena([ ], [b,c],[b,c]). sucesso

concatena([], [b,c], [b,c]). sucesso

E se forem pedidas novas solues com o ; apareceriam as seguintes soluesL1=[a,b] L2=[c] ; L1=[a,b,c] L2=[ ]Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

80

O Predicado concatena O predicado concatena permitiu:Juntar duas listas instanciadas, gerando uma terceira lista com a concatenao das duas primeiras Gerar todas as listas que concatenadas possam dar origem a uma lista instanciada

E se trocssemos a ordem das clusulas?concatena1([A|B],C,[A|D]):-concatena1(B,C,D). concatena1([ ],L,L).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

81

O Predicado concatenaA interaco agora seria a seguinte: ?- concatena1([a,b],[c,d,e],L). L = [a,b,c,d,e] ?- concatena1(L1,L2,[a,b,c]). L1 = [a,b,c] , L2 = [] ; L1 = [a,b] , L2 = [c] ; L1 = [a] , L2 = [b,c] ; L1 = [] , L2 = [a,b,c] as solues so as mesmas, mas geradas noutra ordemAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

82

O predicado inverte Hoje em dia as implementaes de PROLOG j trazem o predicado reverse/2 que inverte a lista do 1 argumento originando a lista do 2 argumento. Mas se esse predicado no existisse poderia ser implementado do seguinte modo:inverte(L,LI):-inverte1(L,[ ],LI). inverte1([ ],L,L). inverte1([X|L],L2,L3):- inverte1(L,[X|L2],L3).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

83

O predicado inverte Vamos mudar ligeiramente o predicado para perceber o que se passa:

inverte(L,LI):-inverte1(L,[ ],LI). inverte1([ ],L,L). inverte1([X|L],L2,L3):- write([X|L2]=), write([X|L2]),nl, inverte1(L,[X|L2],L3).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

84

O predicado inverte?- inverte([a,b,c],L). [X|L2]=[a] [X|L2]=[b,a] [X|L2]=[c,b,a] L = [c,b,a]

Observe-se que na lista do 2 argumento de inverte1 foi sendo construda a lista invertida, a qual passada para o 3 argumento de inverte1 quando a lista do 1 argumento fica [ ]Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

85

O predicado apaga Hoje em dia as implementaes de PROLOG j trazem o predicado delete/3 que apaga as ocorrncias do elemento do 1 argumento na lista do 2 argumento originando a lista do 3 argumento. Mas se esse predicado no existisse poderia ser implementado do seguinte modo:apaga(_,[ ],[ ]). apaga(X,[X|L],M):-!,apaga(X,L,M). apaga(X,[Y|L],[Y|M]):-apaga(X,L,M).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

86

O predicado apagaapaga(_,[ ],[ ]). apaga(X,[X|L],M):-!,apaga(X,L,M). apaga(X,[Y|L],[Y|M]):-apaga(X,L,M).

Vejamos uma interaco?- apaga(1,[1,2,1,3,1,4],L). L = [2,3,4] ; no

Como deveria ser o predicado se fosse pretendido que se apagasse apenas a primeira ocorrncia do elemento na lista? O que aconteceria se fosse removido o ! e pedidas vrias solues?Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

87

O predicado apaga?- apaga(1,[1,2,1,3,1,4],L). L = [2,3,4] ; L = [2,3,1,4] ; L = [2,1,3,4] ; L = [2,1,3,1,4] ; L = [1,2,3,4] ; L = [1,2,3,1,4] ; L = [1,2,1,3,4] ; L = [1,2,1,3,1,4] ; no

Justifique o nmero de solues encontradas e a ordem pela qual as solues aparecemAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

88

O predicado unio O predicado unio diferente da concatenao na medida que as listas representam conjuntos, logo no podem ter elementos repetidos. Esse predicado pode ser implementado do seguinte modo:unio([ ],L,L). unio([X|L1],L2,LU):-membro(X,L2),!,unio(L1,L2,LU). unio([X|L1],L2,[X|LU]):-unio(L1,L2,LU).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

89

O predicado uniounio([ ],L,L). unio([X|L1],L2,LU):-membro(X,L2),!,unio(L1,L2,LU). unio([X|L1],L2,[X|LU]):-unio(L1,L2,LU).

Vejamos uma interaco?- unio([1,2,3,4],[1,3,5,7],L). L = [2,4,1,3,5,7]

Justifique por que razo a soluo obtida no [1,2,3,4,5,7] O que aconteceria se fosse removido o ! pedidas vrias solues?Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

e90

O predicado uniounio([ ],L,L). unio([X|L1],L2,LU):-membro(X,L2),unio(L1,L2,LU). unio([X|L1],L2,[X|LU]):-unio(L1,L2,LU). ?- unio([1,2,3,4],[1,3,5,7],L). L = [2,4,1,3,5,7] ; L = [2,3,4,1,3,5,7] ; L = [1,2,4,1,3,5,7] ; L = [1,2,3,4,1,3,5,7]

Justifique o nmero de solues encontradas e a ordem pela qual as solues aparecemAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

91

O predicado interseco O predicado interseco anlogo ao unio, desde que estejamos a pensar em termos de conjuntos. Esse predicado pode ser implementado do seguinte modo:interseco([ ],_,[ ]). interseco([X|L1],L2,[X|LI]):-membro(X,L2),!,interseco(L1,L2,LI). interseco([_|L1],L2, LI):- interseco(L1,L2,LI).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

92

O predicado intersecointerseco([ ],_,[ ]). interseco([X|L1],L2,[X|LI]):-membro(X,L2),!,interseco(L1,L2,LI). interseco([_|L1],L2, LI):- interseco(L1,L2,LI).

Vejamos uma interaco?- interseco([1,2,3,4],[1,3,5,7],L). L = [1,3]

O que aconteceria se fosse removido o ! pedidas vrias solues?Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

e

93

O predicado intersecointerseco([ ],_,[ ]). interseco([X|L1],L2,[X|LU]):-membro(X,L2),interseco(L1,L2,LU). interseco([_|L1],L2, LU):- interseco(L1,L2,LU).

?- interseco([1,2,3,4],[1,3,5,7],L). L = [1,3] ; L = [1] ; L = [3] ; L = []

Justifique o nmero de solues encontradas e a ordem pela qual as solues aparecemAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

94

Alguns aspectos complementares da linguagem PROLOG Vamos agora abordar um conjunto de aspectos complementares, incluindo:A converso de strings em listas de cdigos A carga de programas e Bases de Conhecimento A alterao dinmica do conhecimento A entrada/sada usando ficheiros Functores, Argumentos e =.. Solues Mltiplas Definio dinmica de operadores

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

95

Converso de strings em listas de cdigos O predicado name converte o tomo do 1 argumento numa lista de cdigos de caracteres que aparecem no 2 argumento e vice-versa ?- name(abc,L). L = [97,98,99] ?- name(A,[97,97,98,99,98,99]). A = aabcbc

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

96

Carga de programas e Bases de Conhecimento A maioria das implementaes de PROLOG permitem que a carga de uma Base de Conhecimento seja feita atravs de um Menu Contudo, podemos efectuar essa carga a partir de um ficheiro escrito em PROLOG, usando:[filename] ou consult(filename)

comum que um programa PROLOG inicie pela carga de outros ficheiros, vejamos o exemplo do contedo de um ficheiro chamado bc::-consult(bc1),consult(bc2). run:-p,q.Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

97

Carga de programas e Bases de ConhecimentoVejamos o contedo dos ficheiros bc1 e bc2:bc1 contm:p:-write(p).

bc2 contm:q:-write(q).

Vejamos o que acontece quando se faz a consulta de bc:# 0.000 seconds to consult c:\carlos\prolog\bc1.pl # 0.000 seconds to consult c:\carlos\prolog\bc2.pl # 0.000 seconds to consult c:\carlos\prolog\bc.pl ?- run. pqyesAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

98

Carga de programas e Bases de Conhecimento Quando num programa aparece o :- sem nada esquerda isso significa que nesse momento o que est do lado direito executado automaticamente, mesmo antes de ser interpretado o restante do programa Em qualquer momento podemos reconsultar um ficheiro escrito em PROLOG, usando:[-filename] ou reconsult(filename)

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

99

Alterao dinmica do conhecimento Podemos inserir novos factos, e mesmo regras na Base de Conhecimento com o predicado assert ou asserta ou assertz Tambm possvel retirar factos e regras com o predicado retract Contudo, tais factos ou regras tm que ser declaradas como sendo dinmicas atravs de dynamic predicado/aridade100

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

Alterao dinmica do conhecimentoUm exemplo: ?- figura(F,NL). F = hexgono , NL = 6 ?- cria_figuras. yes ?- figura(F,NL). F = quadrado , NL = 4 ; F = hexgono , NL = 6 ; F = tringulo , NL = 3 ; F = pentagono , NL = 5

:-dynamic figura/2. figura(hexgono,6). cria_figuras:assertz(figura(tringulo,3)), asserta(figura(quadrado,4)), assertz(figura(pentagono,5)).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

101

Alterao dinmica do conhecimentoUm exemplo: ?- retract(figura(tringulo,X)). X=3 ?- retract(figura(X,Y)). X = quadrado Y=4

:-dynamic figura/2. figura(hexgono,6). cria_figuras:assertz(figura(tringulo,3)), asserta(figura(quadrado,4)), assertz(figura(pentagono,5)).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

102

Alterao dinmica do conhecimentoUm exemplo criando uma regra:

?- r(X,Y). no ?- cria_regra. yes ?- r(X,Y). X=a, Y=e; X=a, Y=f; X=a, Y=g

:-dynamic r/2. cria_regra:-asserta((r(X,Y):-r1(X,Z),r2(Z,Y))). r1(a,b). r1(a,c). r1(a,d). r2(b,e). r2(b,f). r2(d,g).

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

103

Entrada/Sada usando ficheiros O modo tradicional de entrada/sada usando ficheiros para entrada o seguinte: see(filename) as operaes de leitura passaro a ser feitas usando o ficheiro filename ( o novo input stream) seen fecha o input stream seeing(F) F toma o valor do input streamAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

104

Entrada/Sada usando ficheiros O modo tradicional de entrada/sada usando ficheiros para sada o seguinte: tell(filename) as operaes de escrita passaro a ser feitas usando o ficheiro filename ( o novo output stream) told fecha o output stream telling(F) F toma o valor do output streamAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

105

Functores, Argumentos Termo estrutura com 1 functor e argumentos (tal como acontece nos factos) functor(T,F,N) o termo T tem o functor F e N argumentos?- functor(f(a,b,c),F,N). F=f, N=3

arg(N,T,A) A o nmo argumento de T?- arg(2,f(a,b,c),A). A=bAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

106

=.. O =.. Converte o termo que est a sua esquerda numa lista, cuja cabea o functor do termo e os outros elementos so os diversos argumentos do termo?- f(a,b,c)=..L. L = [f,a,b,c] ?- T=..[a,b,c]. T=a(b,c)

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

107

Solues MltiplasQuando uma questo colocada o PROLOG d as solues uma a uma, carregando-se em ; Mas tal pouco prtico, existindo predicados que colocam todas as solues numa lista bagof(X,Q,L) L a lista dos X que atendem a Q, se no houver soluo bagof falha setof(X,Q,L) L a lista dos X que atendem a Q, L vem ordenada, elementos repetidos so eliminados, se no houver soluo setof falha findall(X,Q,L) L a lista dos X que atendem a Q, se no houver soluo findall tem sucesso com L=[]Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

108

Solues Mltiplasf(a,1). f(a,2). f(a,2). f(z,6). f(z,5). f(x,4). f(x,3). ?- findall(f(L,N),f(L,N),Lista). L=_, N=_, Lista = [f(a,1),f(a,2),f(a,2),f(z,6),f(z,5),f(x,4),f(x,3)] ?- setof(f(L,N),f(L,N),Lista). L=_, N=_, Lista = [f(a,1),f(a,2),f(x,3),f(x,4),f(z,5),f(z,6)] ?- bagof(f(L,N),f(L,N),Lista). L=_, N=_, Lista = [f(a,1),f(a,2),f(a,2),f(z,6),f(z,5),f(x,4),f(x,3)] ?- findall(f(L,N),(f(L,N),N>7),Lista). L=_, N=_, Lista = [] ?- setof(f(L,N),(f(L,N),N>7),Lista). no ?- bagof(f(L,N),(f(L,N),N>7),Lista). noAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

109

Solues Mltiplas O findall muito usual:findall(_,cruzamento,_) findall(L,linha(_,L),LE) findall(Linha,(linha(Linha,LEL),member(E,LEL)),LL) findall(_, (estaes(LE),member(E,LE),todas_linhas(E,LL), assertz(estao_linhas(E,LL))), _) findall(h(L,C,Q,LN),member(h(L,C,Q,LN),LLH),LLHQ)110

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

Um exemplo integrador Vamos considerar conhecimento: a seguinte Base de

capital(portugal,lisboa). capital(espanha,madrid). capital(frana,paris). capital(itlia,roma). capital(inglaterra,londres).

Vamos escrever um programa que crie na Base de Conhecimento factos com o seguinte formatonome_pas(nome_capital)Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

111

Um exemplo integradorconverte:findall((X,Y),capital(X,Y),L), assert_pas_capital(L).

assert_pas_capital([(X,Y)|L]):-T=..[X,Y], assertz(T), assert_pas_capital(L). assert_pas_capital([]).

Note-se que os novos factos s ficam residentes em memria (e no no ficheiro com o programa)

Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

112

Um exemplo integradorVamos resolver o mesmo problema enviando os novos factos para um ficheiro pais_cap que seja posteriormente consultadoconverte1:findall((X,Y),capital(X,Y),L), tell(pais_cap), write_file(L), told, consult(pais_cap).

write_file([(X,Y)|L]):-T=..[X,Y], write(T),write(.),nl, write_file(L). write_file([ ]).Algoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

113

Operadores op(Precedncia,Notao,Nome) A precedncia um valor numrico A Notao pode ser:fx: prfixa xf: psfixa xfx,xfy,yfx: infixa

A um mesmo nvel so aplicados os operadores que tm o valor numrico inferior de precedncia. Para ultrapassar ambiguidades podemos usar os (), cuja precedncia nulaAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

114

Operadores:-op(700,xfy,ou). :-op(600,xfy,e). :-op(500,fy,nao). X ou Y :- X;Y. X e Y :- X,Y. nao X :- not X. a. b. c:-fail. ?- a e b. yes ?- a ou b. yes ?- a e c. no ?- nao a. no ?- nao c. yesAlgoritmia Avanada/Terico-Prticas/3ano/LEI apontamentos elaborados por: Carlos Ramos

115