1. O que são consultas?
Uma consulta (ou goal) é uma pergunta que fazemos ao sistema Prolog. O motor de inferência tenta provar que a consulta é verdadeira, usando os fatos e regras disponíveis. Se conseguir, responde true (ou mostra os valores das variáveis); se não, responde false.
As consultas são feitas no prompt ?- do SWI-Prolog e são interativas — diferentemente dos fatos, que ficam salvos em arquivos. Elas são o seu “modo de conversa” com o conhecimento.
2. Consultas com fatos concretos: o veredito yes/no
O tipo mais simples de consulta é perguntar sobre um fato específico que já declaramos. Por exemplo, usando nossa árvore genealógica (vamos supor uma base bíblica simples):
Arquivo genealogia.pl:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
% =========================================== % Árvore genealógica da família % =========================================== % Relação pai pai(adão, cain). pai(adão, abel). pai(adão, seth). pai(seth, enos). % Relação mãe mae(eva, cain). mae(eva, abel). mae(eva, seth). |
No SWI-Prolog, carregamos o arquivo:
|
1 2 |
?- [genealogia]. true. |
Agora, consultas diretas:
|
1 2 3 4 5 6 7 8 |
?- pai(adão, cain). % Adão é pai de Cain? true. % Sim, o fato existe! ?- pai(adão, abel). % Adão é pai de Abel? true. ?- pai(adão, noé). % Adão é pai de Noé? false. % Não, não declaramos esse fato. |
false — não importa se “no mundo real” é verdade. Você precisa declarar tudo o que quer que o sistema conheça.
3. Variáveis: perguntas abertas com X, Y, Pessoa
O verdadeiro poder das consultas aparece quando usamos variáveis. Uma variável em Prolog (sempre começando com maiúscula) representa um valor desconhecido que o sistema tentará descobrir.
Exemplo: “Quem é o pai de Abel?”
|
1 2 |
?- pai(X, abel). % X é uma variável (maiúscula!) X = adao. % O sistema encontrou a resposta |
O que aconteceu? O Prolog procurou em todos os fatos pai/2 e encontrou pai(adao, abel). Ele então unificou a variável X com o átomo adao, e nos mostrou o resultado.
pai(X, abel), o sistema diz: “Para provar isso, preciso encontrar um pai cujo segundo argumento seja abel; o primeiro argumento será o valor de X.” E encontra.
4. Múltiplas respostas: o ponto-e-vírgula (;) e o backtracking
E se houver mais de uma resposta? Exemplo: “Quem são os filhos de Adão?”
|
1 2 3 4 |
?- pai(adao, Filho). Filho = caim ; % Digite ';' (ponto-e-vírgula) para ver mais Filho = abel ; % O sistema voltou (backtracking) e encontrou outra Filho = sete. % Última resposta (ponto final ou Enter) |
O mecanismo que permite isso é o backtracking: quando o Prolog encontra uma solução, ele a apresenta e “marca” o ponto onde parou. Se você pedir mais (;), ele volta atrás (desfaz a unificação) e procura outra solução.
- Digite
;(ponto-e-vírgula) → mostra a próxima solução. - Digite Enter (ou .) → para e aceita a solução atual.
- Digite a → mostra todas as soluções de uma vez (útil para muitas respostas).
- Digite Espaço → também avança para a próxima (funciona como
;em algumas versões).
Exemplo com muitas respostas:
|
1 2 3 4 5 6 7 8 9 10 11 |
?- pai(adao, Filho). Filho = caim ; Filho = abel ; Filho = sete. ?- pai(Pai, Filho). % Quem é pai de quem? (todas as relações) Pai = adao, Filho = caim ; Pai = adao, Filho = abel ; Pai = adao, Filho = sete ; Pai = sete, Filho = enos ; ... (continua) |
Se você digitar a após a primeira resposta, ele exibe todas de uma vez:
|
1 2 3 4 5 |
?- pai(adao, Filho). Filho = caim Filho = abel Filho = sete. true. |
5. Explorando a árvore genealógica com consultas
🔹 Quem são os filhos de Adão?
|
1 2 3 4 |
?- pai(adao, Filho). Filho = caim ; Filho = abel ; Filho = sete. |
🔹 Quem é o pai de Enos?
|
1 2 |
?- pai(Pai, enos). Pai = sete. |
🔹 Quem são os netos de Adão?
Para isso, precisamos de uma consulta com duas variáveis e uma condição implícita: o pai do neto deve ser filho de Adão.
|
1 2 3 |
?- pai(adao, Filho), pai(Filho, Neto). Filho = sete, Neto = enos ; % Sete é filho de Adão e pai de Enos false. % (só um neto direto nessa base) |
Explicação: a vírgula (,) significa “e” (conjunção lógica). O Prolog tenta satisfazer ambas as condições.
pai(adao, Filho), pai(Filho, Neto) é lida como: “Existe um Filho que é filho de Adão e, para esse mesmo Filho, existe um Neto que é filho dele?” Isso nos dá os netos.
🔹 Quem são os bisnetos de Adão?
|
1 2 3 4 |
?- pai(adao, A), pai(A, B), pai(B, Bisneto). A = sete, B = enos, Bisneto = cainã. |
Perceba como as variáveis A e B são usadas para encadear as relações.
6. Consultas vs. Fatos: qual a diferença?
| Fatos (no arquivo .pl) | Consultas (no prompt) |
|---|---|
| Declarações permanentes de verdade. | Perguntas temporárias ao sistema. |
| Fazem parte da base de conhecimento. | Não alteram a base de conhecimento. |
Escritas com ponto final (.) e minúsculas. | Podem ter variáveis (maiúsculas) e terminam com ponto final também. |
Exemplo: pai(adao, caim). | Exemplo: ?- pai(adao, X). |
assert/1 (que veremos depois). Para fatos permanentes, sempre use arquivos .pl.
7. 📝 Exercícios práticos para você
Use a base genealógica que criamos (ou a sua própria) e responda:
- Quem são os filhos de Sete?
- Quem é o avô de Cainã?
- Quem são todos os descendentes diretos (filhos, netos, bisnetos) de Adão? (Dica: use múltiplas variáveis).
- Existe alguém que seja pai de mais de um filho? Quem?
- Quantos filhos Noé tem? (Se não tiver nenhum, a resposta será
false). - Crie uma consulta que liste todas as relações
pai/2em ordem alfabética pelo nome do pai. (Dica: usefindall/3ou apenaslisting(pai).).
Anote suas respostas e confira no SWI-Prolog. Lembre-se de usar ; para ver todas as soluções!
8. Resumo e próximos passos
O que aprendemos:
- Consultas são perguntas feitas ao sistema no prompt
?-. - Consultas concretas retornam
trueoufalse. - Variáveis (maiúsculas) permitem perguntas abertas, como “quem é o pai de X?”
- O backtracking (com
;) encontra múltiplas respostas. - A unificação é o mecanismo que liga variáveis a valores.
- Consultas são interativas; fatos são permanentes e ficam em arquivos.
Com as consultas, você já pode explorar toda a sua base de fatos. No próximo artigo, vamos aprender a criar regras — que são como “fatos derivados” — para responder perguntas mais complexas, como “quem são os avós?” ou “quem são os irmãos?”, sem precisar declarar cada relação explicitamente.