PROLOG - Programming in Logic

	É uma linguagem de programação centralizada em torno de um pequeno conjunto de mecanismos:
•	Pesquisa por padrão (pattern-matching).
•	Estrutura de dados baseada em árvore.
•	Backtracking automático.
•		Este pequeno conjunto constitui uma estrutura poderosa e flexível de programação.
•		prolog é especialmente indicado para objetos - principalmente objetos estruturados - e as relações entre estes objetos. Muito usada como linguagem suporte em aplicações não numéricas e Inteligência Artificial (I.A.).
•		prolog foi uma idéia que nasceu na década de 70 para usar lógica com uma linguagem de programação. Os desenvolvedores desta idéia foram:
•		-Robert Kowalski: responsável pelo lado teórico
•		-Maarten Van Emdem: responsável pela demonstração experimental
•		-Alain Comerauer: responsável pela Implementação
•		Enquanto as linguagens convencionais usam um conceito de programação procedural (exemplo pascal), a linguagem prolog é uma linguagem declarativa.
•	Em que prolog pode ser usado
•	Para controlar e monitorar processos industriais.
•	Implementar Banco de Dados inteligentes.
•	Traduzir linguagens para linguagens naturais (humana), ou de uma linguagem de programação para outra.
•	Construir interfaces de linguagem natural.
•	Construir Sistemas Especialistas.
•	Construir pacotes para manipulação de símbolos que resolvem equações, diferenciais e integrais não definidas, demonstram teoremas.
Introdução à prolog

Esta seção apresenta as principais características de prolog através de um programa exemplo. Embora seja uma apresentação informal, aqui são introduzidos vários conceitos importantes.
Um programa exemplo: Definindo relações familiares.

Prolog é uma linguagem para computação simbólica, não numérica. Ela é indicada para resolver problemas que envolvem objetos e relações entre estes objetos. A figura abaixo apresenta um exemplo de relações familiares:

	O fato que João é pai de Joaquim pode ser escrito em prolog como:

	pai(joao,joaquim).

	Aqui nos escolhemos pai como o nome da relação e joao e  joaquim como os argumentos . Por razões que se tornarão mais claras mais tarde, nós escrevemos os nomes como joao e joaquim com a primeira letra minúscula e sem acento. A árvore genealógica acima pode ser definida pelo seguinte programa prolog:

pai(joao,joaquim).  % joao e' pai de joaquim.
pai(joao,lucas).
pai(pedro,silvia).
pai(joaquim,bruno).
mae(maria,joaquim). % maria e' mae de joaquim.
mae(maria,lucas).
mae(laura,silvia).
mae(silvia,bruno).

	Este programa consiste de 6 (seis) cláusulas. Cada uma destas cláusulas declara um fato sobre as relações familiares: pai e mãe. Quando este programa for carregado num sistema Prolog, poderemos fazer algumas perguntas sobre estas relações familiares. Por exemplo: pedro é pai de sílvia? Esta questão pode ser transmitida para o sistema prolog digitando-se:

	?- pai(pedro,silvia).

	Se prolog encontrar um fato correspondente no programa, responderá:

	yes

	Para a consulta:

	?- pai(pedro,claudio).

	Prolog responderá:

	no

	Prolog não encontra nenhum fato no programa que diz que Pedro é pai de Cláudio, então responde não para esta questão.
	Algumas questões mais interessantes podem ser perguntadas para o sistema Prolog. Por exemplo: quem é o pai de Sílvia?

	?- pai(X,silvia).

	Prolog não responderá somente ‘yes’ ou ‘no’ desta vez. Prolog responderá qual é o valor de X que torna a questão acima verdadeira. Então a resposta será:

	X = pedro

	A questão ‘quem é filho de João’ pode ser perguntada à Prolog como:

	?- pai(joao,X).

	Desta vez há mais de uma resposta para esta questão. Prolog apresenta a primeira solução:

	X = joaquim;

	Nós podemos agora pedir outras soluções. Se nós digitamos ; (ponto-e-vírgula), Prolog encontrará outra resposta:

	X = lucas

	Se nós requisitarmos outra solução, Prolog responderá com ‘no’ porque todas as respostas já foram encontradas.
	Nosso programa pode responder a uma questão mais ampla. Quem é pai de quem? Outra formulação para esta questão é:
	Encontre X e Y tal que X é pai de Y.
	Isto é escrito em Prolog como:

	?- pai(X,Y).

	Prolog agora encontrará todos os pares pai-filho. A solução será apresentada enquanto digitarmos ; (ponto-e-vírgula), e pára quando digitarmos . (ponto) ou nenhuma outra solução for encontrada. A resposta será:

	X = joao
	Y = joaquim ;

	X = joao
	Y = lucas ;

	X = pedro
	Y = silvia ;

	X = joaquim;
	Y = bruno .

	Nosso programa Prolog pode responder a questões mais complicadas como: Quem é o avô de bruno? Como o nosso programa ainda não sabe sobre a relação familiar avô, esta consulta deve ser quebrada em dois passos, como ilustrado na figura abaixo:

1	Quem é o pai de bruno? Assuma que é algum Y.
2	Quem é o pai de Y? Assuma que é algum X.

	Tal consulta pode ser feita aos sistema Prolog como a concatenação de duas questões simples:

	?- pai(Y,bruno),pai(X,Y).

	A resposta será:

	X = joao
	Y = joaquim .
	Nossa consulta pode ser lida como: Encontre X e Y que satisfaça aos dois requisitos: pai(Y,bruno) e pai(X,Y). Se mudarmos a ordem destes dois requisitos o significado lógico da consulta permanece o mesmo: pai(X,Y), pai(Y,bruno).

Exercícios:
1	Sejam pai e mãe as relações como definidas no programa exemplo anterior. Qual será a resposta de prolog para as seguintes questões:
•	pai(joao, X).
•	pai(X,joaquim).
•	pai(joao,X), pai(X,bruno).
1	Formule em prolog as seguintes consultas sobre as relações pai e mãe do programa anterior.
•	Quem é o pai de Bruno?
•	Maria tem filhos?
•	Quem é o avô de Bruno?

Estendendo o programa prolog para regras
	Como uma extensão para o programa prolog anterior podemos escrever uma regra para as relações familiares: avô paterno, avô materno, avó paterna e avó materna. Em prolog estas relações podem ser definidas a partir das relações pai e mãe. Assim:
	avo_paterno(X,Y) :- pai(X,Z), pai(Z,Y).
	Esta regra pode ser lida como:
	X é avo de Y se X é pai de Z e Z é pai de Y.
	As regras especificam coisas que podem ser verdadeiras se uma condição é satisfeita. As regras tem duas partes:
	A condicão - lado direito da regra.
	A conclusão - lado esquerdo. Por exemplo :
								conclusão                          condição					
avo_paterno(X,Y) :- pai(X,Z), pai(Z,Y).

	As outras regras são:
	avo_materno(X,Y) :- pai(X,Z), mae(Z,Y).
	avoh_paterna(X,Y) :- mae(X,Z), pai(Z,Y).
	avoh_materna(X,Y) :- mae(X,Z), mae(Z,Y).

Exercícios:
1	Traduza as seguintes afirmações em regras prolog:
•	Todos que tem filhos são felizes (defina uma relação de um argumento feliz).
•	X é irmão de Y se X e Y são filhos do mesmo pai e da mesma mãe.
1	Defina a relação neto a partir das relações pai e mãe.
2	Defina a relação anterior a partir das relações avo_materno, avo_paterno, avoh_paterna e avoh_materna.