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)