Estudaremos um caso de linguagem orientada à programação lógica ( cálculo de predicados ): Prolog.
PROLOG está orientado à resolução de problemas mediante o cálculo de predicados, baseado em:
Perguntas à base de dados.
Provas matemáticas.
O programa PROLOG especifica como deve ser a solução, ao invés de dar o algarismo para sua resolução. A solução se obtém mediante busca aplicando a lógica de predicados.
História
Coulmerauer (1970) desenvolveu uma linguagem para fazer deduções de texto.
Aplica-se um mecanismo de resolução sobre predicados especiais, cláusulas de Horn, chamado unificação.
A difusão da linguagem se produziu nos anos 80, mas de forma muito limitada devido à falta de aplicações em tal linguagem.
Perspectiva da linguagem
O programa prolog se compõem de fatos (dados) e um conjunto de regras, ou seja, relações entre objetos da base de dados.
A execução do programa carregado em memória consiste em realizar uma pergunta de forma interativa: o intérprete gerará por inferência os resultados que se deduzem a partir do conteúdo da base de dados.
PROLOG tem uma sintaxe e semântica simples. Só busca relações entre os objetos criados, as variáveis e as listas, que são suas estruturas básicas.
Comentários entre /* */
Objetos de dados
Tipos de dados primitivos: variáveis e constantes:
Inteiros
Reais
Caracteres
Os identificadores com minúscula representam fatos, os que vão com maiúscula variáveis.
O alcance de uma variável é a regra onde aparece.
Tipos de dados estruturados:
Átomos: constantes e variáveis de cadeia.
Listas, representadas entre [ ].
Tipos definidos pelo usuário. As regras para definir relações podem atuar como tipos de usuário.
Representação de armazenamento
As regras e fatos são armazenados na memória como listas enlaçadas.
A execução de prolog consiste em uma busca em profundidade de um diagrama contendo todas as possíveis soluções. Para cada uma delas se avaliará sua correção. A busca se pode fazer mais eficiente mediante a poda do diagrama de busca (corte).
Controle de seqüência
A ordem de avaliação é seqüencial.
Expressões, operações aritméticas e operadores relacionais. Not().
Enunciados
Fatos, relações que se expressam em uma consulta com um nome de predicado e uns argumentos.
Regras, implicações que se expressam em uma operação consult.
Perguntas, sucessão de términos que finalizam com um ponto.
Cortes, (!), força o retrocesso na busca. Isto pode impedir que se encontrem certas soluções, mas pode fazer mais eficiente a busca.
Entrada e saída, nl e write.
Subprogramas e gestão de armazenamento
PROLOG tem dois modos:
Modo consulta, introduzem-se novas relações (fatos) no armazenamento dinâmico da base de dados.
Modos pergunta, executa-se um intérprete baseado para avaliar as perguntas do usuário.
Alcance das variáveis:
Ambiente local de referência, todas as variáveis são locais à regra a qual estão definidas. A unificação faz interagir nomes locais de uma regra com os de outras regras.
Ambiente comum de referência, todos os dados são compartidos.
Passo de parâmetros, a unificação proporciona o passo de parâmetros entre regras.
Funções normais, já vão integradas na linguagem:
Consult(nomearquivo)
Fail, sempre fracassa.
See(nomearquivo), lê as entradas de um arquivo e as incorpora ao conjunto de regras.
Write(término).
Tell(término), re-orienta a saída do write ao arquivo.
Told, fecha o arquivo anterior.
Nl, quebra de linha.
Atom(X), devolve certo se X é um átomo.
Var(X), devolve certo se X é uma variável.
Integer(X), devolve certo se X é um inteiro.
Trace, ativa a depuração do programa.
Abstração e encapsulamento
PROLOG não proporciona estas capacidades.
Avaliação da linguagem
PROLOG vai bem para problemas de relações, p.e. Tratamento da linguagem natural, e consulta de bases de dados.
Apesar de ser possível desenvolver programas sem especificar o algarismo de resolução, às vezes há que utilizar outro tipo de programação para tornar os programas mais eficientes, e muitas vez se emprega o corte para limitar o espaço de busca.