1. O que são regras e por que são essenciais?
Uma regra em Prolog é uma afirmação condicional: “X é verdadeiro se Y e Z forem verdadeiros”. Enquanto fatos são verdades absolutas, regras são verdades dependentes — elas só são verdadeiras quando suas condições são satisfeitas.
As regras são essenciais porque permitem:
- Evitar repetição: Não precisamos declarar cada avô explicitamente.
- Generalização: A regra funciona para qualquer pessoa na árvore.
- Manutenção: Se adicionarmos novos fatos, as regras funcionam automaticamente.
- Abstração: Expressamos conceitos de alto nível (avô, irmão) em termos de conceitos mais básicos (pai).
2. Sintaxe: cabeça e corpo
A estrutura básica de uma regra é:
|
1 |
cabeça :- corpo. |
- Cabeça: É o predicado que estamos definindo (ex:
avo(X, Y)). :-: Lê-se “se” ou “se … então”.- Corpo: Uma conjunção de objetivos (fatos ou regras) que devem ser verdadeiros para que a cabeça seja verdadeira.
.), assim como os fatos. A cabeça e o corpo podem ter variáveis que serão compartilhadas.
3. Exemplo clássico: a relação “avô”
A definição de “avô” em Prolog é elegantemente simples:
|
1 |
avo(X, Y) :- pai(X, Z), pai(Z, Y). |
Interpretação: X é avô de Y se X é pai de Z e Z é pai de Y. A variável Z é compartilhada entre os dois objetivos, representando o pai intermediário (a “ponte” entre avô e neto).
4. O significado lógico de :- (se)
O operador :- é a espinha dorsal das regras em Prolog. Ele expressa uma implicação lógica:
- Lado direito (corpo): as condições que devem ser satisfeitas.
- Lado esquerdo (cabeça): a conclusão que podemos inferir.
5. Adicionando a regra à árvore genealógica
Nosso arquivo familia.pl atualizado com a regra:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
% =========================================== % Árvore genealógica com regras % =========================================== % Fatos - relações básicas pai(adão, cain). pai(adão, abel). pai(adão, seth). pai(seth, enos). pai(enos, cainã). pai(cainã, malalel). mae(eva, cain). mae(eva, abel). mae(eva, seth). % Regras - relações derivadas avo(X, Y) :- pai(X, Z), pai(Z, Y). |
No SWI-Prolog ou SWISH, carregue o arquivo:
|
1 2 |
?- [familia]. true. |
6. Consultando a nova regra: avo/2
Agora podemos fazer perguntas que antes seriam impossíveis apenas com fatos:
🔹 Quem é o avô de Enos?
|
1 2 |
?- avo(X, enos). X = adão. % Adão é avô de Enos |
🔹 Quem são os netos de Adão?
|
1 2 3 |
?- avo(adão, Neto). Neto = enos ; % Enos é neto de Adão false. |
🔹 Quem são todos os avós e netos?
|
1 2 3 4 5 |
?- avo(Avo, Neto). Avo = adão, Neto = enos ; % Adão é avô de Enos Avo = seth, Neto = cainã ; % Seth é avô de Cainã Avo = enos, Neto = malalel ; % Enos é avô de Malalel false. |
7. Como o Prolog executa uma regra (passo a passo)
Quando você pergunta avo(adão, enos), o Prolog:
avo(X, Y) com a consulta avo(adão, enos) → X = adão, Y = enos.
pai(adão, Z), pai(Z, enos).
pai(adão, Z). Encontra pai(adão, seth) → Z = seth.
Z = seth: pai(seth, enos) → é verdade!
true (com X = adão).
pai(seth, X) não encontrasse enos), o Prolog volta atrás (backtracking) e tenta outra solução para o primeiro objetivo.
8. Regra vs. Fatos: elegância e concisão
Com fatos explícitos (ruim):
|
1 2 3 4 5 6 |
avo(adão, enos). avo(seth, cainã). avo(enos, malalel). % E para cada nova pessoa, precisaríamos adicionar mais fatos! % Trabalhoso e propenso a erros. |
Com regra (bom):
|
1 2 3 4 |
avo(X, Y) :- pai(X, Z), pai(Z, Y). % Uma única linha define TODOS os avôs da árvore! % Se adicionarmos novos fatos, a regra funciona automaticamente. |
A regra é mais elegante porque:
- Concisão: uma linha substitui muitas.
- Generalidade: funciona para qualquer número de pessoas.
- Manutenibilidade: se a definição de avô mudar, só precisamos alterar um lugar.
- Corretude: a lógica é clara e verificável.
9. Predicados definidos pelo usuário vs. primitivos
| Predicados Primitivos (built-in) | Predicados Definidos pelo Usuário |
|---|---|
| Já vêm com o Prolog. | São criados por você. |
Ex: write/1, listing/1, findall/3. | Ex: avo/2, neto/2, irmao/2. |
| São implementados em C/linguagem de baixo nível. | São implementados em Prolog puro (fatos + regras). |
| Não podem ser modificados. | Você pode adicionar ou alterar quantas regras quiser. |
Exemplo: ?- listing(pai). | Exemplo: ?- avo(adão, X). |
10. Resumo: o poder das regras
O que aprendemos:
- Regras são definições condicionais:
cabeça :- corpo. - O corpo é uma conjunção de objetivos que devem ser verdadeiros.
- Regras permitem derivar conhecimento a partir de fatos.
- São mais concisas, gerais e fáceis de manter do que fatos explícitos.
- O Prolog executa regras unificando a cabeça e depois provando o corpo.
- Predicados definidos pelo usuário são a espinha dorsal de programas Prolog.
Com regras, sua árvore genealógica se transforma em um sistema de inferência completo. Você pode fazer perguntas complexas sem precisar declarar cada relação individualmente. No próximo artigo, vamos explorar regras com múltiplas definições e recursão — onde as regras se tornam ainda mais poderosas!