O que acontece ao executar a seguinte consulta em Prolog?

X = 1 + 2.

Era de se esperar que X fosse instanciado com o valor 3, mas não é isso o que acontece. Em vez disso, X é instanciado com o termo complexo 1+2 ou, equivalentemente, +(1, 2).

% As duas formas são idênticas:
1 + 2 == +(1, 2).

Operador is

O operador binário is é similar ao operador de unificação, =, com uma diferença: o lado direito (e apenas o lado direito) é interpretado como uma expressão aritmética e seu resultado é calculado antes da unificação. Exemplos:

X is 1 + 2.
3 is 1 + 2.

A segunda consulta retorna true porque o lado direito do operador is é avaliado como expressão aritmética, resultando no valor 3, e 3 (lado esquerdo) pode ser unificado com 3 (lado direito).

Contra-exemplo:

1 + 2 is 3.

O último exemplo não funciona porque o lado esquerdo do is não é avaliado como expressão aritmética. Ao tentar unificar +(1, 2) com 3, a unificação falha.

Operadores aritméticos

O Prolog possui os operadores mais comuns, como +, -, *, /, abs, sin, cos, tan, exp, ln, log, sqrt, dentre outros. A precedência entre operadores é respeitada. Exemplo:

X is 1 + 2 * 3.
X is sqrt(9).

Não confunda operadores com predicados! Operadores aritméticos são funções que retornam um número.

Operadores de comparação

Prolog admite operadores de comparação, como > e <. Ao usar um desses operadores, ambos os lados são avaliados como expressão aritmética. Exemplos:

4 > 3.   /* true */
8 + 1 < 5 + 5.   /* true */
X is +(8, 1), X < X + 1.   /* true */

Operadores de comparação:

  • <: menor que
  • >: maior que
  • >=: maior ou igual a
  • =<: menor ou igual a (a maioria das outras linguagens usa <=)
  • =:=: igual a
  • =\=: diferente de

Note que esses operadores não realizam unificação! Por isso, as variáveis devem estar instanciadas antes de se realizar a comparação. Exemplo:

X =:= 5.
/* [Error] =:=/2: Arguments are not sufficiently instantiated */

Qual o resultado das seguintes consultas?

1 + 2 == +(1, 2).
1 + 2 == 2 + 1.
1 + 2 == 1 + X.
1 + 2 = 1 + X.
1 + 2 = X.
1 + 2 = 2 + 1.
1 + 2 = 2 + X.
1 + 2 =:= 2 + 1.
1 + 2 =:= 2 + X.
X is 1 + 2.
1 + 2 is X.

Ver também exercícios da página 78 do livro Learn Prolog Now.

Exercícios

Exercício 25. Escreva uma regra para o predicado entre(X, A, B), que indica que o número X está entre os números A e B, inclusive (isto é, deve retornar verdadeiro também se X = A ou X = B). Assuma que A é menor ou igual a B.

Exercício 26. Reescreva a regra da questão anterior de forma que funcione para quaisquer dois valores inteiros de A e B, seja A maior ou menor do que B.

Exercício 27. Escreva uma regra para o predicado triplo(X, Y), que indica que X é o triplo do número Y. Teste com a seguinte consulta: triplo(X, 4). O que acontece se você consultar triplo(12, Y), para tentar obter um terço de 12?

Exercício 28. Escreva uma regra para o predicado par(X), que indica se o número inteiro não-negativo X é par. Lembre-se de que 0 é par. Use o operador mod(X, Y), que retorna o resto da divisão de X por Y.

Exercício 29. Reescreva a regra da questão anterior sem usar o operador mod.

Exercício 30. Escreva uma regra para o predicado fatorial(X, Y), que indica que o fatorial de X é Y. Dica: considere que o fatorial de 0 é 1 e que o fatorial de X é igual a X multiplicado pelo fatorial de X - 1.

Exercício 31. Escreva uma regra para o predicado sucessor(X, Y), que indica que o número X é sucessor do número Y.