Prolog/Noções básicas de Prolog
Tipos de dados
editarProlog não emprega tipos de dados do mesmo modo que as linguagens de programação mais comuns normalmente fazem. Todos os dados são tratados como sendo de um único tipo, Termo, cuja natureza depende da forma como esse termo foi declarado. Ou seja, os elementos léxicos utilizados na sua declaração determinam se esse termo será um número, um texto, uma variável, uma estrutura complexa e assim por diante.
Escopo dos identificadores
editarCom exceção de átomos numéricos, funções ou predicados construídos, os nomes em Prolog para constantes, variáveis, funções e predicados, não têm nenhum significado intrínseco e podem ser escolhidos livremente pelo programador. Em geral, duas notações distintas denotarão ou serão objetos distintos. Como em qualquer linguagem de programação, a cada nome deve ser dado um escopo.
Em Prolog, as regras de escopo são:
- O escopo de uma variável é a asserção (fato, regra, ou consulta) na qual aparece.
- O escopo de qualquer outro nome (constante, nome de função, ou nome de predicado) é todo o programa.
Isto significa que um nome de variável pode ser utilizado e reutilizado a vontade no programa para denotar variáveis diferentes, enquanto qualquer outra notação representa, ou é, o mesmo objeto para o programa todo.
Átomos
editarAs constantes de texto são introduzidas por meio de átomos. Um átomo é uma seqüência constituída de letras, números e underscore, mas iniciando com uma letra minúscula. Se um átomo não alfanumérico é necessário, pode-se usar qualquer seqüência entre aspas simples (ex: 'um átomo contendo espaços').
Um átomo pode ser definido das seguintes maneiras:
começando com letra minúscula:
pedro henrique_iv
como uma sequência de caracteres entre aspas simples:
'quem é você?' 'eu não sei.'
Números
editarUm número é uma seqüência de dígitos, permitindo também os sinais de . (para números reais), - (número negativo) e e (notação científica). Algumas implementações do Prolog não fazem distinção entre inteiros e números reais.
exemplos:
321 3.21
Variáveis
editarVariáveis são declaradas da mesma forma que átomos, porém iniciando com uma letra maiúscula ou underscore. No ambiente Prolog uma variável não é um contêiner cujo valor pode ser atribuído (como ocorre nas linguagens imperativas). Seu comportamento é mais próximo de um padrão, que é incrementalmente especificado pela unificação. Em outras palavras, uma variável Prolog é como uma incógnita, cujo valor é desconhecido a princípio mas, após descoberto, não sofre mais mudanças.
Um tipo especial de variável, a variável anônima (explicada mais adiante), é uma expressão que significa 'qualquer variável', e é escrita como um único subtraço (_).
exemplos:
X Nome Rei_da_Espanha
Termos compostos
editarTermos compostos são a única forma de se expressar estruturas de dados complexas em Prolog. Um termo composto consiste de uma cabeça, também chamada funtor (que é obrigatoriamente um átomo) e parâmetros (de quaisquer tipos) listados entre parênteses e separados por vírgulas.
O número de parâmetros, chamado aridade do termo, é significativo. Um termo é identificado por sua cabeça e aridade, normalmente escrita como funtor/aridade. Átomos e números também podem ser identificados dessa forma, como um termo de aridade zero (ex: um_atomo/0).
Exemplos
editarrodrigo
é um átomo, e pode ser considerado um funtor de aridade 0.
gordo(rodrigo)
é um termo composto por um funtor de aridade 1 (gordo), com um parâmetro.
pai(rodrigo, gabriel)
é um termo composto por um funtor de aridade 1 (pai), com dois parâmetros (rodrigo e gabriel).
Nada impede que os parâmetros também sejam termos compostos:
produto(fracao(1,raiz(produto(2,pi))),exp(menos(fracao(quadrado(x),2))))
é um termo composto por um funtor de aridade 2 (produto), com dois parâmetros compostos.
Sintaticamente, termos como:
2 + 2
são termos compostos usando um funtor de aridade 2 ('+'). Ou seja, é a mesma coisa escrever 2 + 2 ou '+'(2,2), como pode ser visto com:
2 + 2 = '+'(2,2).
Listas
editarUma lista não é um tipo de dados à parte, mas sim definida por uma construção recursiva (usando o termo '.'/2):
- o átomo [] é uma lista vazia;
- se T é uma lista e H é um elemento, então o termo '.'(H, T) é uma lista.
O primeiro elemento, chamado cabeça, é H, que é seguida pelo conteúdo do restante da lista, T, também chamado de cauda. A lista [1, 2, 3] seria representada internamente como '.'(1, '.'(2, '.'(3, []))). Um atalho sintático é [H | T], que é mais usado para construir regras. Uma lista pode ser processada como um todo processando o primeiro elemento, e em seguida o restante da lista, de forma recursiva.
Para conveniência do programador, as listas podem ser construídas e destruídas de várias formas.
- Enumerando os elementos: [abc, 1, f(X), Y, g(A,rst)]
- Precedendo-a com um elemento: [abc | L1]
- Precedendo-a com múltiplos elementos: [abc, 1, f(X) | L2]
- Expandindo o termo: '.'(abc, '.'(1, '.'(f(X), '.'(Y, '.'(g(A,rst), [])))))
- O predicado append
Strings
editarStrings são normalmente escritas como uma seqüência de caracteres entre aspas. É comum serem representadas internamente como listas de códigos de caracteres, em geral utilizando a codificação local ou Unicode, se o sistema dá suporte a Unicode. O ISO Prolog também permite que strings sejam representadas por uma lista de átomos com um único caractere.