Conceitos
Prolog = PROgramming in LOGic
Origens: anos 70
Linguagem baseada na lógica de predicados de 1ª ordem, ou
melhor, no seu subconjunto da lógica clausal (Horn).
Ideias principais
programa = conjunto de axiomas (cláusulas)
computação = prova construtiva de uma afirmação a
partir dos axiomas.
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
1
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Conceitos
Motivação das cláusulas
A :- A1, ..., An.
A se A1e ... e An. ( A é verdadeiro se A1, ..., An forem
verdadeiros)
Exemplo: passar a uma disciplina da LEI
passar(D, X) :- disciplina(D, lei), inscrito(D,X), positiva(D,X).
O Prolog é uma linguagem essencialmente declarativa, em que o
problema a resolver é exposto através de cláusulas. Estão no entanto
envolvidos igualmente aspectos procedimentais.
A :- A1, ..., An.
Uma maneira de resolver A é resolver A1, ..., An.
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
2
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Termos em Prolog
Termos
Termos simples Termos compostos
Constantes
Variáveis
Átomos Números
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
3
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Átomos
Os átomos podem ser
strings de letras, dígitos e o caracter _ , começando com uma letra
minúscula
strings de caracteres especiais (<, >, -, =, :), etc.
Ex. <----->, ====>, ::==
strings de caracteres entre plicas
Ex. ‘Funchal’, ‘323-ABS’
Números
Os números em Prolog podem ser inteiros ou reais (estes últimos não são
muito utilizados).
Ex. 1, 1990, 0, -80, 3.14, -0.00334
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
4
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Variáveis
As variáveis são strings de letras, dígitos e o caracter _ , começando com
uma letra maiúscula ou com _ .
Ex. X, Resultado, List, _objecto1
Termos compostos
Os termos compostos são formados a partir de uma função aplicada a um
conjunto de argumentos. A função segue a sintaxe dos átomos e os
argumentos são também termos.
Ex. aluno(ricardo, departamento(universidade_madeira, matematica),
7003289)
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
5
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Os termos compostos são o correspondente em Prolog das estruturas
noutras linguagens de programação.
A identificação de termos baseia-se em duas características: o nome e a
aridade. O mesmo nome pode estar associado a diferentes funções.
Ex. ponto(X,Y)
ponto(X, Y, Z)
corresponde à função ponto/2
corresponde à função ponto/3
Um termo diz-se chão se nele não intervêm quaisquer variáveis.
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
6
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Cláusulas: Factos e Regras
Uma cláusula é uma fórmula A :- A1, ..., An quantificada universalmente
constituída pela cabeça A e pelo corpo (A1, ..., An), neste caso a
conjunção de diversos objectivos.
Os As são literais (predicados aplicados a termos).
(Pontuação: as cláusulas são sempre sucedidas de um ponto ‘.’; a
conjunção de objectivos expressa-se através da vírgula ‘,’)
No caso do corpo ser vazio as cláusulas chamam-se usualmente factos,
exprimindo relações universais.
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
7
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
pais e maes
pai(antonio, rui).
pai(antonio, sandra).
mae(maria, rui).
mae(maria, sandra).
(o antónio é pai do rui)
(a maria é mae do rui)
feminino(maria).
feminino(sandra).
masculino(antonio).
masculino(rui).
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
8
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Quando o corpo não é vazio as cláusulas designam-se por regras,
definindo relações à custa de outras relações.
filhos e filhas
filho(X,Y) :- pai(Y,X), masculino(X).
filho(X,Y) :- mae(Y,X), masculino(X).
filha(X,Y) :- pai(Y,X), feminino(X).
filha(X,Y) :- mae(Y,X), feminino(X).
ou
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
9
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
progenitor(X,Y) :- pai(X,Y).
progenitor(X,Y) :- mae(X,Y).
filho(X,Y) :- progenitor(Y,X), masculino(X).
filha(X,Y) :- progenitor(Y,X), feminino(X).
irmaos
irmao(X,Y) :- masculino(X), progenitor(F, X), progenitor(F,Y), not(X==Y).
irma(X,Y) :- feminino(X), progenitor(F, X), progenitor(F,Y), not(X==Y).
Defina as relações de avo_m_f(avô ou avó); tio; tia;
primo_m_f(primo ou prima).
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
10
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Solução!
avo_m_f(X,Y) :- progenitor(X,Z), progenitor(Z,Y).
tio(X,Y) :- irmao(X,Z), progenitor(Z,Y).
tia(X,Y) :- irma(X,Z), progenitor(Z,Y).
primo_m_f(X,Y) :- pai(Z,Y), tio(Z,X).
primo_m_f(X,Y) :- mae(Z,Y), tia(Z,X).
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
11
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Um conjunto de regras com o mesmo predicado à cabeça é chamado um
procedimento, tal como o que encontrámos no exemplo anterior para
progenitor.
Quando as variáveis apenas intervêm uma vez nas cláusulas podem
ser substituídas pela variável anónima _ .
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
12
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Interrogações
A forma de se obter informação de um programa Prolog é através de
interrogações. Uma interrogação é uma fórmula cujas variáveis são
quantificadas existencialmente e o seu objectivo é obter uma das
seguintes respostas:
não, se a fórmula não se verificar para todos os valores
possíveis para as variáveis intervenientes.
sim, se a fórmula for verdadeira para alguns valores das
suas variáveis. Neste caso a resposta inclui as diferentes
valorações das variáveis que tornam a fórmula verdadeira
(através da utilização do símbolo ; )
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
13
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Utilização do SWI-Prolog
Para trabalhar em Prolog vai ser utilizado um interpretador ao qual
serão fornecidos programas e sobre os quais podemos fazer
perguntas.
Depois de ‘abrir’ o interpretador SWI-Prolog aparece-nos o cursor:
?ao qual podemos colocar uma interrogação:
?- interrogacao.
No entanto teremos de ‘alimentar’ o interpretador com as relações que
definimos num ficheiro de texto com extensão .pl (ou .swi):
?- consult(‘ficheiro’).
ou
[‘ficheiro’]
O ficheiro ficheiro é lido e os ‘procedimentos’ definidos ficam
disponíveis para possíveis interrogações.
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
14
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Considere-se o programa anterior dos parentescos enriquecido com os
seguintes factos:
pai(alberto, antonio).
pai(alberto, luisa).
mae(emilia, antonio).
mae(emilia, luisa).
?- pai(X, rui).
X= antonio
yes
(Quem é o pai do rui?)
?- avo_m_f(alberto, X).
X= rui;
X= sandra;
no
(Quem são os netos de alberto?)
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
15
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Sintaxe
Em Prolog o raciocínio é feito sob o princípio do mundo fechado, isto
é, toda a informação que não é expressa directamente ou que não
pode ser deduzida é considerada como falsa.
Defina a árvore da sua família utilizando os predicados pai
e mae e faça algumas experiências com perguntas sobre os
seus parentes. Se desejar, pode definir mais predicados para
expressar outras relações de parentesco.
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
16
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
‘Database programming’
Existem 2 estilos básicos na utilização de programas lógicos:
definir uma base de dados lógica
manipular estruturas de dados
Uma base de dados lógica é composta de um conjunto de factos e
regras.
Os factos definem relações universais.
As regras definem relações mais complexas.
Assim, um programa lógico composto por um conjunto de regras e
factos, que tenham um formato restrito, podem expressar
funcionalidades semelhantes às bases de dados relacionais.
Podemos ver isso pelo exemplo de definições de parentesco que
temos estado a definir.
Universidade da Madeira
Departamento de Matemática
Elsa Carvalho
17
Programação em Lógica e Funcional (2000/01)
(Actualizado em 2004/05)
Download

Introdução Prolog - Universidade da Madeira