Prolog/Matemática

Origem: Wikilivros, livros abertos por um mundo aberto.

Esta seção explica como usar a matemática em Prolog, usando funções e a igualdade.

Números[editar | editar código-fonte]

Números são usados como constantes, e podem fazer parte de predicados. Por exemplo:

a(12, 345).
a(A) :- b(A, 234.3).
a(345.3409857) :- b(23476.923804).
b(3e7) :- c(3.0e7).

Note-se que 3e7 e 3.0e7 são o mesmo número, como pode ser visto por:

3e7 == 3.0e7.

Atribuição matemática[editar | editar código-fonte]

A forma correta de se atribuir um valor a uma variável é através do predicado is/2.

Veja:

 4 = 2 + 2.

E compare com:

 4 is 2 + 2.

Funções[editar | editar código-fonte]

A maioria dos predicados representam valores, verdadeiro ou falso. Por exemplo, ao escrever-se a(A, B), temos que esta expressão pode ser verdadeira ou falsa.

Uma função parece com um predicato, mas representa um valor. cos(0), por exemplo, não é nem verdadeiro nem falso, mas o valor 1.

Isto pode ser visto assim:

 X is cos(0).

que associará a X o valor 1. Compare com:

 X = cos(0).

em que X será associado ao valor cos(0).

Funções podem ser usadas sempre que um número ou uma constante puderem ser usados, em pesquisas, predicados ou regras.

As funções abaixo estão presentes na maioria das versões de Prolog:


função exemplo resultado
+ 2 + 3 5
- 4 - 1 3
* 4 * 3 12
/ 22/7 3.14286
^ 4 ^ 2 16
sin sin(3) 0.14112

(tabela incompleta)

Note-se que as funções não podem ser usadas como um predicado comum. A pergunta ?- sin(3). vai gerar uma mensagem de erro, porque sin() foi implementado como função e não como predicado.

Uma diferença entre função e predicado é que, na maioria das vezes, o predicado é definido no programa, enquanto que a função foi definida na implementação. É possível criar funções do usuário.

Comparação entre = e is[editar | editar código-fonte]

Existem vários significados de igualdade, com significados um pouco diferentes. Neste capítulo, será feita uma comparação entre o operador = e o operador is.

O resultado de:

?- A is 22/7.

é fazer a operação matemática de divisão, e atribuir o resultado à variável A. Assim, a resposta será:

A = 3.14286

O operador =, no entanto, funciona de forma diferente. Ele não resolve o lado direito, mas mantém como uma fórmula. Assim, temos:

?- A = 22/7.
A = 22/7

Em vez de fazer a conta e atribuir o resultado à variável A, Prolog atribuir a expressão (sem avaliar) à variável.

Pode-se ver o mesmo efeito com perguntas. Por exemplo:

?- (1 is (2-1)).

vai retornar "Yes" (verdadeiro), porque o operador is força a avaliação da conta (2-1), que é igual a 1. Por outro lado:

?- (1 = (2-1)).

Vai retornar "No", porque Prolog compara um número constante (1) com uma fórmula (2-1), em vez de comparar com o resultado da fórmula.

O operador is existe especificamente para funções matemáticas. O lado esquerdo deve ser uma variável, e o lado direito deve ser uma expressão matemática que só contenha funções matemáticas e constantes matemáticas.

O operador = é usado para unificar expressões e variáveis e pode ser usado com quaisquer dois argumentos, falhando quando os dois argumentos não são iguais e não podem se tornar iguais através de mudanças nas variáveis.

Testes de igualdade, diferença e comparação[editar | editar código-fonte]

A comparação entre números é feita por:

'=:='/2: sucesso na igualdade entre números, falha caso contrário
'=\='/2: sucesso quandos os números são diferentes, falha caso contrário
'>'/2 (analogamente para '<', '=<', '>='): sucesso na comparação correta, falha caso contrário

Estes predicados não devem ser usados para variáveis livres.

Exemplos[editar | editar código-fonte]

Seguem alguns exemplos do uso da matemática.

plus(A, B, C) :- C is A + B.

Este predicado soma dois números (A and B) e unifica o resultado com C.

O exemplo clássico do fatorial é um pouco mais complexo:

fac(0,1).
fac(A,B) :- 
      A > 0, 
      Ax is A - 1,
      fac(Ax,Bx), 
      B is A * Bx.

Este programa calcula o fatorial de a (representado como A!).

O programa funciona recursivamente. A primeira regra declara que o fatorial de 0 é 1 (nota sobre convenção: é indiferente dizer que fac(a, b) significa b = a! ou que a = b!; mas a convenção, uma vez estabelecida, deve ser mantida e documentada). A segunda regra declara que o fatorial de um número maior que 0 é o fatorial deste número menos um, multiplicado por este número.

Este programa tem uma falha estética: em Prolog, como uma linguagem lógica, é interessante que seja possível operar dos dois lados; assim, fac(X,1) deveria dizer que X pode ser 0 ou 1, fac(X,2) deveria dizer que X só pode ser 2, e assim por diante.

Exercícios[editar | editar código-fonte]