A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Elsa Carvalho 18 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Programação recursiva.

Apresentações semelhantes


Apresentação em tema: "Elsa Carvalho 18 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Programação recursiva."— Transcrição da apresentação:

1 Elsa Carvalho 18 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Programação recursiva - Exemplo Definição recursiva dos números naturais (definição de 1 tipo de dados) natural(0). natural(suc(X)) :- natural(X). Operações sobre números naturais soma(0,X,X):- natural(X). soma(suc(X), Y, suc(Z)) :- soma(X, Y, Z). produto(0, X, 0) :- natural(X). produto(suc(X), Y, Z) :- produto(X,Y, W), soma(W,Y,Z).

2 Elsa Carvalho 19 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exemplo Comparação com os axiomas equacionais vistos na especificação de tipos de dados abstractos: soma(zero, X) = X soma(suc(X), Y) = suc(soma(X,Y)) produto(zero, X) = zero produto(suc(X), Y) = soma(produto(X,Y), Y)

3 Elsa Carvalho 20 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exemplo Exemplos de perguntas possíveis ?- soma(suc(0), suc(0), X). X = suc(suc(0)) yes ?- soma(suc(0), X, suc(suc(0))). X = suc(0) yes ?- soma(X, Y, suc(suc(0))). X = 0X = suc(0)X = suc(suc(0)) Y = suc(suc(0));Y = suc(0);Y = 0; no

4 Elsa Carvalho 21 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exemplo ?- soma(suc(X), suc(suc(0)), Y), produto(suc(suc(0)), X, Y). X = suc(suc(suc(0))) Y = suc(suc(suc(suc(suc(suc(0)))))) yes Unificação. Árvores de Pesquisa. Apresente a árvore de pesquisa para a 3ª interrogação e para: ?- soma(suc(0), X, suc(suc(X))). apresentando o unificador mais geral em cada derivação

5 Elsa Carvalho 22 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exercício Defina em Prolog os procedimentos correspondentes às seguintes operações sobre naturais, para acrescentar às já definidas (podendo as mesmas ser utilizadas na definição): factorial potência Solução factorial(0, suc(0)). factorial(suc(X), Z) :- factorial(X,Y), produto(suc(X), Y, Z). potencia(0, suc(X), 0). potencia(suc(X), 0, suc(0)). potencia(0, 0, indeterminacao). potencia(N, suc(X), Y) :- potencia(N, X, Z), produto(Z, X,Y).

6 Elsa Carvalho 23 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Aritmética A definição de operadores sobre números naturais que foi feita anteriormente, embora esteja expressa numa forma relacional, torna-se demasiado artificial e ineficiente. Assim, em Prolog podemos fazer uso de operadores aritméticos não lógicos pré-definidos (pelo sistema), como por exemplo >, +, *, -, etc. A interrogação ?3>2 tem como resposta yes Esta faceta mostra uma componente não lógica do Prolog que é o seu processador de expressões aritméticas.

7 Elsa Carvalho 24 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Aritmética Assim temos, em Prolog, as seguintes funções cujos argumentos são expressões aritméticas: X+YX-YX/YX//YX mod YX rem Y-X exp(X) log(X)log10(X) sqrt(X)sin(X) cos(X) tan(X) floor(X)X^Y Predicados aritméticos (X e Y são expressões aritméticas, Z é um termo) Z is XX é avaliado e o resultado é unificado com Z X =:= Yé verdadeiro se os valores de X e Y são iguais X =\= Yé verdadeiro se os valores de X e Y são diferentes

8 Elsa Carvalho 25 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Avaliador de expressões aritméticas O interpretador de Prolog possui um processador de expressões deste tipo que é invocado com interrogações da forma: Variavel is expressao O predicado is denomina o avaliador aritmético. A interrogação pode ser lida como “Variavel toma o valor do resultado de expressao”. Ou seja expressao é processada como uma expressão aritmética e o seu resultado é unificado com Variavel. A interrogação tem ou não sucesso de acordo com o resultado desta unificação.

9 Elsa Carvalho 26 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Avaliador de expressões aritméticas O operador = denomina unificação explicita. Corresponde à igualdade de termos, provocando a instanciação das variáveis envolvidas. Não provoca o processamento da expressão. Por exemplo se tivermos Z = 5 + 3 Z é substituido por 5+3 e não por 8. A interrogação ?Y=3, X is 5 + Y. tem como resultado X=8, Y=3.

10 Elsa Carvalho 27 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Avaliador de expressões aritméticas No entanto podemos ter situações de erro se a expressão a calcular não for totalmente instanciada. Por exemplo ?Y=X+3, Z is Y+1, X=5. Neste exemplo a primeira unificação é perfeitamente válida. É possível unificar uma variável com uma expressão. No entanto não é possível calcular uma expressão aritmética com variáveis não instanciadas. Neste exemplo o Prolog interrompe a computação e produz uma mensagem de erro.

11 Elsa Carvalho 28 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Exemplo factorial(0,1). factorial(N, F) :- N1 is N-1, factorial(N1, F1), F is N * F1. De notar que interrogações do tipo ?factorial(X, 2). dão origem a mensagens de erro e consequente paragem da execução. Porquê?

12 Elsa Carvalho 29 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Avaliador de expressões aritméticas O operador Z =:= 3+Y compara apenas o resultado do processamento de Z e de 3+Y, o que implica que tenham que ser expressões aritméticas. Não provoca instanciação de variáveis.


Carregar ppt "Elsa Carvalho 18 Universidade da Madeira Departamento de Matemática Programação em Lógica e Funcional (2000/01) (Actualizado em 2004/05) Programação recursiva."

Apresentações semelhantes


Anúncios Google