Paradigmas de Linguagens de Programação Paradigma de Programação em Lógica Aula #11 (CopyLeft)2010 - Ismar Frango ismarfrango@gmail.com
Paradigma de Programação em Lógica (ou Declarativo) ?- ama (julieta,lomeu). :false.
a:-b Origens 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).
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  Pro grammation en  Log ique ) é 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), ECL i PS e , etc.
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 .*/ Qualquer proposição lógica do tipo: (p E q E R...) implica Z Prolog
(Breve) Embasamento teórico Basicamente, 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 .
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

E:\Plp 2009 2\Plp Aula11

  • 1.
    Paradigmas de Linguagensde Programação Paradigma de Programação em Lógica Aula #11 (CopyLeft)2010 - Ismar Frango ismarfrango@gmail.com
  • 2.
    Paradigma de Programaçãoem Lógica (ou Declarativo) ?- ama (julieta,lomeu). :false.
  • 3.
    a:-b Origens Aprogramação em lógica inicia com a publicação do artigo de John Alan Robinson em 1965 pela ACM: &quot;A Machine-Oriented Logic Based on the Resolution Principle&quot; Uma das primeiras linguagens a implementar os resultados de Robinson é Prolog, proposta por Alain Colmerauer e Phillipe Roussel em 1972 (Marseille).
  • 4.
    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 Pro grammation en Log ique ) é 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), ECL i PS e , etc.
  • 5.
    Prolog é baseadoem 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 .*/ Qualquer proposição lógica do tipo: (p E q E R...) implica Z Prolog
  • 6.
    (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 .
  • 7.
    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