Atribuição em PROLOG Em PROLOG temos 2 operadores de atribuição = para a atribuição simbólia X=a is para a atribuição numéria X is 5 A atribuição simbólia é bidireional, para X=Y temos: Se X não está instaniado e Y está então temos X Y Se X está instaniado e Y não está então temos X Y Se nenhum está instaniado então passam a ser a mesma variável Se ambos estão instaniados om o mesmo valor então há suesso Se ambos estão instaniados om valores diferentes então oorre uma falha 32?- X=Y,X=a. X = Y = a Atribuição em PROLOG?- 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. no 33 1
Atribuição em PROLOG A atribuição numéria é unidireional Do lado direito do is, se estiverem envolvidas variáveis, elas devem estar instaniadas Do lado esquerdo a variável não deve estar instaniada, senão oorre uma falha Do lado direito as variável que apareçam devem estar instaniadas Em PROLOG N is N+1 nuna tem suesso 34 Esrita em PROLOG A esrita no output stream (normalmente o monitor) é feita om o write write(hello) esreve hello write( Hello World ) esreve Hello World write(hello) esreve onteúdo da variável Hello Outra possibilidade é esrever usando o put put(65) esreve o arater A (ódigo ASCII 65) A mudança de linha é feita om o nl 35 2
Leitura em PROLOG A leitura do input stream (normalmente o telado) é feita om o read read(x) lê o valor de X Deve-se terminar om o. seguido de RETURN Outra possibilidade é ler usando o get ou o get0 get(a) lê o próximo aráter (não brano, ou seja, ignora CR, TAB, espaço) get0(a) - lê o próximo aráter?- get(x),get(y),get(z). ab X = 97, Y = 98, Z = 99?- get0(x),get0(y),get0(z). ab X = 97, Y = 98, Z = 13 36 Reursividade O uso da reursividade é muito omum na linguagem PROLOG Na implementação de um prediado reursivo devemos ter em atenção que deverá haver sempre uma alternativa para finalizar as hamadas reursivas Por uma regra, ou fato, que não efetua essa hamada Por uma das alternativas de uma disjunção 37 3
Reursividade fatorial(0,1):-!. /* a função do! será expliada posteriormente */ fatorial(n,f):-n1 is N-1,fatorial(N1,F1),F is N*F1. Vejamos o que aontee quando se efetua a hamada?-fatorial(3,f). F=6 fatorial(0,1) falha fatorial(3,f):-n1 3-1,fatorial(2,F1), F is 3*2. suesso (/ F 6) fatorial(0,1) falha fatorial(2,f):-n1 2-1,fatorial(1,F1), F is 2*1. suesso (/ F 2) fatorial(0,1) falha fatorial(1,f):-n1 1-1,fatorial(0,F1), F is 1*1. suesso (/ F 1) fatorial(0,1):-!. suesso 38 Reursividade Considerando o seguinte programa que resolve o problema das Torres de Hanói: hanoi(n):-move(n,e,,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. Efetue a traçagem do que aontee quando se faz a hamada?-hanoi(3). 39 4
Reursividade?- hanoi(3). Su. hanoi(3):-move(3,e,,d). Su. 4 (2) move(3,e,,d):-m is 3-1, move(2,e,d,), informa(e,), move(2,d,,e). Su. 2 (2) move(2,e,d,):-m is 2-1, move(1,e,,d), informa(e,d), move(1,,d,e). Su. 1 (2) move(1,e,,d):-m is 1-1, move(0,e,d,), informa(e,), move(0,d,,e). Su. 3 (2) move(1,,d,e):-m is 1-1, move(0,,e,d), informa(,d), move(0,e,d,). Su. Output: 1 e 2 e 3 4 e 5 d 6 d 7 e d d e 6 (2) move(2,d,,e):-m is 2-1, move(1,d,e,), informa(d,), move(1,e,,d). Su. 5 (2) move(1,d,e,):-m is 1-1, move(0,d,,e), informa(d,e), move(0,,e,d). Su. 7 (2) move(1,e,,d):-m is 1-1, move(0,e,,d), informa(e,), move(0,,d,e). Su. hanoi(n):-move(n,e,,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. 40 Estruturas de Controlo do PROLOG Em PROLOG temos 4 estruturas de ontrolo prinipais: true tem sempre suesso fail Falha sempre repeat tem sempre suesso, quando se volta para trás por baktraking e se passa pelo repeat, este tem sempre suesso e obriga a ir para a frente! lê-se ut, uma vez atingida uma solução para o que está antes do! Já não será possível voltar para trás (antes do ut) pelo proesso de baktraking 41 5
O true Se não existisse em PROLOG o true poderia ser implementado pelo seguinte fato: true. Vejamos um exemplo onde o true faz sentido idade1(c):- fia(c,p), ((P==portugal,write(C),write( é portuguesa ), nl);true). Se não tivéssemos o true oorreria uma falha se C não fosse uma idade portuguesa, mas o que queremos é que tenha suesso se C for uma idade e para o aso partiular de ser portuguesa deve apareer uma mensagem esrita indiando isso 42 O fail O fail obriga à oorrênia de uma falha, é útil no raioínio pela negativa Vejamos um exemplo usando o fail sem_preedentes(x):-preede(_,x),!,fail. sem_preedentes(_). preede(a,b). preede(a,). preede(,d). preede(b,e). preede(f,h). preede(d,h). preede(g,i). preede(e,i). 43 6