Prolog

Como instalar prolog

O programa que usarei para interpretar a linguagem prolog será o swi-prolog.

Este programa pode ser facilmente instalado no Windows, Linux e Mac.

Basta acessar a página de downloads (https://www.swi-prolog.org/download/stable) e escolher o programa para o seu sistema operacional.

Introdução

Prolog usa o paradigma de linguagem declarativa.
Diferente da paradigama da liguagem procedural, onde se escreve cada comando do que o computador deve fazer;
na linguagem declarativa o problema é declarado através de uma descrição do problema usando fatos e regras de dedução.

Definidos os fatos e regras, podemos fazer perguntas para o programa, obtendo uma resposta, mais de uma resposta, ou até nenhuma resposta.

Fatos e Regras

Para entendermos o que são fatos e regras vamos considerar o seguinte cenário:

Cenário 1

Podemos representar este cenário com os fatos

legal(maria).
legal(joao).

A sintaxe f(x) denota um fato f sobre o sujeito x.
Chamamos a função f de predicado.

Podemos então perguntar se Maria é legal:

?- legal(maria).
true.
Cenário 2

Podemos representar este cenário com os fatos

gosta(maria, joao).
gosta(joao, maria).

Da mesma forma que podemos representar um fato com um sujeito, também podemos representar com mais de um: f(x, y).
Neste caso chamamos a função f de relação.

Podemos então perguntar se Maria gosta de João:

?- gosta(maria, joao).
true.
Cenário 3

Podemos representar este cenário com os fatos e uma regra:

legal(maria).
legal(joao).
gosta(maria, joao) :- legal(joao).

Uma regra é denotada pelo símbolo a :- b com o sentido de "a é verdade se b é verdade".

Podemos então perguntar se Maria gosta de João e vice versa:

?- gosta(maria, joao).
true.
?- gosta(joao, maria).
false.
Cenário 4

Podemos representar este cenário com os fatos e uma regra:

legal(maria).
legal(joao).
gosta(maria, X) :- legal(X).

Aqui usamos uma variável X, que pode ter o valor de qualquer sujeito.

Variáveis são denotadas por qualquer palavra que comece com letra maiúscula.

?- gosta(maria, joao).
true.
?- gosta(joao, maria).
false.
Cenário 5

Podemos representar este cenário com os fatos e uma regra:

legal(maria).
legal(joao).
gosta(Y, X) :- legal(X).

OBS: Este exemplo dará um warning avisando que a variável Y está livre (não está ligada a nenhuma outra variável Y). Para evitar o warning substitua o Ypor _.

legal(maria).
legal(joao).
gosta(_, X) :- legal(X).
?- gosta(maria, joao).
true.
?- gosta(joao, maria).
true.
Cenário 6

Podemos representar este cenário com os fatos e uma regra:

legal(maria).
bondoso(maria).
legal(joao).
gosta(Y, X) :- legal(X), bondoso(X).

Em uma regra, para representar a conjunção use o operador , entre dois fatos.

?- gosta(maria, joao).
false.
?- gosta(joao, maria).
true.
Cenário 7

Podemos representar este cenário com os fatos e uma regra:

legal(maria).
bondoso(maria).
legal(joao).
gosta(Y, X) :- legal(X); bondoso(X).

Em uma regra, para representar a disjunção use o operador ; entre dois fatos.

?- gosta(maria, joao).
true.
?- gosta(joao, maria).
true.

Ordem de Verificação

Em uma regra, as afirmações da direita são avaliadas da esquerda para a direita.

Em uma conjunção, se a afirmação da esquerda for falsa, a da direita não será avaliada. Por exemplo, na regra a :- b, c se o fato b for falso, o fato c não será avaliado.

Em uma disjunção, se a afirmação da esquerda for verdadeira, a da direita não será avaliada automaticamente. Por exemplo, na regra a :- b, c se o fato b for falso, o fato c não será avaliado imediatamente. Será exposto ao usuário que a regra é verdadeira, se o usuário quiser continuar a verificação ele deve pressionar ;, caso queira terminar ele deve pressionar ..

Exercício 1

considere o seguinte cenário de uma árvore de ancestralidade:

Ancestralidade Ana Ana Chico Chico Ana->Chico Daiana Daiana Ana->Daiana Fernanda Fernanda Chico->Fernanda Beto Beto Beto->Chico Beto->Daiana Helena Helena Daiana->Helena Ellen Ellen Ellen->Fernanda Ganymede Ganymede Ganymede->Helena

Desconsiderando o gênero dos sujeitos. Represente o fato pai_mae(x, y) para representar a relação de que x é pai ou mãe de y

Baseado nesta relação, represente as regras para