E:\Plp 2009 2\Plp Aula11

7
Paradigmas de Linguagens de Programação Paradigma de Programação em Lógica Aula #11 (CopyLeft)2010 - Ismar Frango [email protected]

Transcript of E:\Plp 2009 2\Plp Aula11

Page 1: E:\Plp 2009 2\Plp Aula11

Paradigmas de Linguagens de Programação

Paradigma de Programação em LógicaAula #11(CopyLeft)2010 - Ismar Frango [email protected]

Page 2: E:\Plp 2009 2\Plp Aula11

?- ama (julieta,lomeu).

:false.

Paradigma de Programação em Lógica (ou Declarativo)

Page 3: E:\Plp 2009 2\Plp Aula11

a:-bOrigens

A programação em lógica inicia com a publicação do artigo de John Alan Robinson em 1965 pela ACM: "A Machine-Oriented Logic Based on the Resolution Principle"

Uma das primeiras linguagens a implementar os resultados de Robinson é Prolog, proposta por Alain Colmerauer e Phillipe Roussel em 1972 (Marseille).

Page 4: E:\Plp 2009 2\Plp Aula11

O Que é o paradigma declarativo?Linguagens que seguem o paradigma declarativo são baseadas em programação em lógica (tradução direta de logic programming).

Prolog (do francês Programmation en Logique) é a linguagem-expoente desse paradigma, embora existam outras, como Gödel, Mercury, MUSE, etc.

Há um outro paradigma derivado deste, que é o paradigma de programação por propagação de restrições (CLP – Constraint Logic Programming), com as linguagens Oz, CLP(R), ECLiPSe, etc.

Page 5: E:\Plp 2009 2\Plp Aula11

Qualquer proposição lógica do tipo:

(p E q E R...) implica Z

• Prolog é baseado em cálculo de predicados de primeira ordem, ou seja, predicados compostos por:– Variáveis (Sem tipagem explícita)– Funções e relações n-árias– Constantes (true e false)– Conectivos lógicos (limitados a e , ou seja,

cláusulas de Horn) /*Algumas outras linguagens lidam com lógica disjuntiva, como DLV.*/

Prolog

Page 6: E:\Plp 2009 2\Plp Aula11

(Breve) Embasamento teóricoBasicamente, a programação em lógica corresponde a escrever códigos como:

goal :- subgoal_1, ..., subgoal_n.

Que significa que para provar goal, é suficiente provar de subgoal_1 até subgoal_n.

Page 7: E:\Plp 2009 2\Plp Aula11

MODULE GCD.IMPORT Integers. PREDICATE Gcd : Integer * Integer * Integer.Gcd(i,j,d) <- CommonDivisor(i,j,d) & ~ SOME [e] (CommonDivisor(i,j,e) & e > d). PREDICATE CommonDivisor : Integer * Integer * Integer.CommonDivisor(i,j,d) <- IF (i = 0 \/ j = 0) THEN d = Max(Abs(i),Abs(j)) ELSE 1 =< d =< Min(Abs(i),Abs(j)) & i Mod d = 0 & j Mod d = 0.

Exemplo em Gödel