1. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
Projeto de especificac¸˜ao da linguagem C+-
Caio Santos, Gabriel Valsiljevic, Jean Silva, Victor Henrique
Universidade Federal do Rio Grande do Norte
Centro de Ciˆencias Exatas e da Terra
Departamento de Inform´atica e Matem´atica Aplicada
4 de junho de 2013
1/40
2. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
CONTE ´UDO
INTRODUC¸ ˜AO
LINGUAGEM IMPERATIVA
Dom´ınio de Aplicac¸˜ao
Principais caracter´ısticas
Sistema de Tipos
Tipos Primitivos
Designadores dos tipos primitivos
Tipos compostos
Express˜oes da Linguagem
Entrada e Sa´ıda
Estruturas de Controle
LINGUAGEM FUNCIONAL
Diferenc¸as marcantes do paradigma imperativo
Sistema de Tipos
Express˜oes da Linguagem
Escopo e Tempo de Vida
Arrays
Estruturas de controle
LINGUAGEM L ´OGICA
Diferenc¸as marcantes do paradigma imperativo
Tipos
Escopo
Operadores e express˜oes
Armazenamento de valores
Arrays
Estruturas de controle
2/40
3. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
DOM´INIO DE APLICAC¸ ˜AO
Linguagem baseada em C e FORTRAN
Dom´ınio de aplicac¸˜ao cient´ıfico
Estruturas de dados simples
Manipulac¸˜ao de grandes quantidades de dados
Alta precis˜ao
Publico alvo
Matem´aticos e cientistas
3/40
4. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
PRINCIPAIS CARACTER´ISTICAS
Legibilidade
Pequeno n´umero de componentes b´asicos (simplicidade
global)
Nomes (designadores) dos tipos primitivos refletem bem
suas finalidades. Ex.: int ≡ inteiro
´E case sensitve
Confiabilidade
´E fortemente tipada
Oferece mecanismos de tratamento de excec¸ ˜oes
Capacidade de escrita
´E pouca ortogonal
Sistema de implementac¸˜ao: compilada
Usa compilac¸˜ao separada
4/40
5. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
SISTEMA DE TIPOS
A linguagem ´e fortemente tipada
Compatibilidade entre tipos
Compatibilidade de nomes e estruturas ser˜ao usados
5/40
6. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
TIPOS PRIMITIVOS
Tabela: Designadores dos tipos primitivos da linguagem
Nome Descri¸c˜ao Tamanho Faixa
char Caractere 1byte −128 a 127 e unsigned: 0 a 255
short Inteiro curto 2bytes −32768 a 32767 e unsigned: 0 `a 65535
int Inteiro 4bytes −2147483648 a 2147483647 e unsigned: 0
`a 4294967295
long Inteiro longo 8bytes −263 `a 263 − 1 e unsigned: 0 `a 264 − 1
bigInt Inteiro muito longo 16bytes −2127 `a 2127 − 1 e unsigned: 0 `a 2128 − 1
bool Valor booleano. 1byte true ou false
float Pronto flutuante 4bytes ±3.4e ± 38
double Precis˜ao dupla do
ponto flutuante
8bytes ±1.7e ± 308
complex N´umeros comple-
xos
8bytes −264 `a 264 − 1
6/40
7. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
TIPOS COMPOSTOS
Conjunto (Set)
1 import utility.set;
2 ...
3 set <int> A;
4 set < set <int> > B;
5 B.add(A);
6 /**
7 * $B supset A$
8 */
7/40
8. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
TIPOS COMPOSTOS
Conjunto (Set)
1 import utility.set;
2 ...
3 set <int> A;
4 set < set <int> > B;
5 B.add(A);
6 /**
7 * $B supset A$
8 */
Lista (List)
1 import utility.list;
2 ...
3 list <int> a;
4 list < list <int> > b;
7/40
11. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
TIPOS COMPOSTOS
Vetor
1 int v[10];
2 int vet[3] = {1, 2, 3};
3 int mat[2][2] = {1, 0;
4 0, 1};
9/40
12. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
TIPOS COMPOSTOS
Vetor
1 int v[10];
2 int vet[3] = {1, 2, 3};
3 int mat[2][2] = {1, 0;
4 0, 1};
O usu´ario pode desejar definir seus pr´oprios tipos
1 struct ListaT {
2 int info;
3 ListaT * prox;
4 };
5 ...
9/40
13. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
EXPRESS ˜OES DA LINGUAGEM
Operador Descric¸˜ao
Operadores Aritim´eticos
+ adic¸˜ao
- subtrac¸˜ao
* multiplicac¸˜ao
/ divis˜ao
% mod ou resto de divis˜ao
Incremento e Decremento
++ incremento
– decremento
Operadores Relacionais
== Igualdade
!= Diferenc¸a
>, < maior que, e menor que
>=, <= maior igual, e menor igual
10/40
14. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
EXPRESS ˜OES DA LINGUAGEM
Operador Descric¸˜ao
Operadores L´ogicos
! NOT
&& AND
|| OR
Operadores bit-a-bit
& AND
| OR
ˆ XOR
˜ NOT
11/40
15. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
TIPOS DEFINIDOS PELO USU ´ARIO
Definic¸˜ao
1 template <typedef struct T>
2 typedef struct Par {
3 T a, b;
4 };
5
6 template <typedef struct T>
7 function getMax (Par <T> p ) : T {
8 return p.a > p.b ? p.a : p.b;
9 }
Uso
1 Par <double> p;
2 p.a = 5.5, p.b = 5.4;
3 write("%lf", getMax(p));
12/40
16. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ENTRADA E SA´IDA
1 import io;
2
3 function main(): int {
4 int a, b;
5 read("%i %i", &a, &b);
6 int soma = a + b;
7 write("%in", soma);
8 return 0;
9 }
13/40
17. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESTRUTURAS DE CONTROLE
CONDICIONAL: COMANDO IF
1 import io;
2
3 function main(): int {
4 int n;
5 read("%d", &n);
6 if (n > 0) {
7 write("%d eh um numero positivon", n);
8 } else if(n < 0){
9 write("%d eh um numero negativon", n);
10 } else {
11 write("%d eh zeron", n);
12 }
13 return 0;
14 }
14/40
18. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESTRUTURAS DE CONTROLE
CONDICIONAL: COMANDO SWITCH-CASE
1 import io;
2
3 function main(): int {
4 string op;
5 read("%s", &op);
6 switch(op) {
7 case "um":
8 write("1n");
9 break;
10 case "dois":
11 write("2n");
12 break;
13 case "tres":
14 write("3n");
15 break;
16 default:
17 write("qwertyn");
18 break;
19 }
20 return 0;
21 }
15/40
19. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESTRUTURAS DE CONTROLE
REPETIC¸ ˜AO: COMANDO FOR
1 import io;
2
3 function main(): int {
4 int n;
5 read("%d", &n);
6 for (int i = 0; i < n; i++) {
7 write("%d ", 2 * (i + 1));
8 }
9 write("n");
10 return 0;
11 }
16/40
25. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
LINGUAGEM FUNCIONAL
DIFERENC¸ AS MARCANTES DO PARADIGMA IMPERATIVO
Linguagems de programac¸˜ao funcional tratam
computac¸oes como avaliac¸ ˜oes matem´aticas.
N˜ao usa vari´aveis ou instruc¸ ˜oes de atribuic¸˜ao.
Programas s˜ao definic¸ ˜oes e aplicac¸ ˜oes de func¸ ˜oes.
Simplificac¸˜ao da semˆantica.
22/40
26. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
SISTEMA DE TIPOS
Praticamente todos os tipos primitivos permanecer˜ao.
Os tipos compotos ser˜ao representados pela tupla.
23/40
27. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
EXPRESS ˜OES DA LINGUAGEM
Os operadores aritm´eticos permanecem da mesma forma.
O incremento e decremento ser˜ao definidos como func¸ ˜oes
primitivas.
1 (int, float, string)
24/40
28. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESCOPO E TEMPO DE VIDA
Comportamento de func¸ ˜oes matem´aticas.
Escopo das vari´aveis ´e est´atico.
Seu resultado n˜ao deve ser afetado pelo contexto em que a
func¸˜ao foi chamada.
25/40
29. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ARRAYS
Arrays foram substituidos por Listas.
Avaliac¸˜ao preguic¸osa, evita c´alculos desnecess´arios e
permite construir estruturas infinitas.
26/40
30. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESTRUTURAS DE CONTROLE
As estruturas condicionais se resumem em uma mescla do
comportamento do switch-case com a avaliac¸˜ao de
condic¸ ˜oes de guarda do if.
Estruturas de repetic¸˜ao interativas deixaram de existir.
Alteradores de fluxo (jumps e escapes) tamb´em ser˜ao
eliminados.
27/40
31. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESTRUTURAS DE CONTROLE
1 //Exemplo Imperativo
2 function ehPrimo(int n) : bool {
3 int i=2;
4 while(i*i){
5 if(i%n==0) return false;
6 i++;
7 }
8 return true;
9 }
10
11 //Exemplo Funcional
12 function ehPrimo n : int -> bool
13 ehPrimoAux(2,n)
14
15 function ehPrimoAux i, n : int, int
16 {i*i>n, true}
17 {i%n == 0, false}
18 ehPrimoAux i+1, n
28/40
32. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
LINGUAGEM L ´OGICA
DIFERENC¸ AS MARCANTES DO PARADIGMA IMPERATIVO
Trabalha com regras e fatos
Vari´aveis n˜ao s˜ao blocos de mem´oria
O programador se preocupa em descrever o problema, e
n˜ao sua soluc¸˜ao
Utiliza backtracking para tentar unificar as vari´aveis
29/40
33. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
TIPOS PRIMITIVOS
N˜ao haver´a ponteiros
N˜ao existir˜ao blocos de mem´oria vis´ıveis ao programador
unsigned e string ser˜ao substitu´ıdos por symbol
30/40
35. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESCOPO
Fatos s˜ao vis´ıveis globalmente
Vari´aveis s˜ao vis´ıveis apenas dentro da regra onde est˜ao
instanciadas
32/40
36. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
OPERADORES E EXPRESS ˜OES
Operadores aritm´eticos e l´ogicos permanecem inalterados
Excec¸˜ao: operador ‘=’ ´e utilizado para unificac¸˜ao, apenas
Utiliza-se ‘is’ para atribuic¸˜ao
Exemplo:
tenta_unificar(X,Y) :- X = Y.
atribuir(X, Y) :- X is Y + 3.
33/40
37. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ARMAZENAMENTO DE VALORES
Fatos s˜ao armazenados em modelo est´atico
Vari´aveis s˜ao armazenadas em modelo dinˆamico em pilha
Devido ao seu uso no backtracking, cujo comportamento ´e
recursivo
34/40
38. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ARRAYS
Definidos como listas ligadas
Representadas como [H|T]
H ´e o primeiro elemento da lista e T seu restante (e.g.:
[1, 2, 3] seria [1|[2, 3]])
Exemplos:
somatorio([], 0).
somatorio([H|T], X) :- somatorio(T, Y), X is H + Y.
35/40
39. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
ESTRUTURAS DE CONTROLE
N˜ao existir˜ao estruturas de controle e fluxo como if-else e
while
Para utilizar estes recursos, deve-se utilizar m´etodos
l´ogicos e recurs˜ao
Comando “!” (cut) utilizado para interromper o processo
de resoluc¸˜ao e impedir lac¸os infinitos
36/40
40. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
EXEMPLO DE PROGRAMA
#numero de elementos de uma lista
num_elements([], 0).
num_elements([_|T], X) :- num_elements(T, Y), X is 1 + Y.
37/40
41. INTRODUC¸ ˜AO LINGUAGEM IMPERATIVA LINGUAGEM FUNCIONAL LINGUAGEM L ´OGICA
EXEMPLO DE PROGRAMA
# alguns fatos
progenitor(joao, mario).
progenitor(helena, carlos).
progenitor(mario, carlos).
sexo(jose, ’masculino’).
sexo(joao, ’masculino’).
sexo(maria, ’feminino’).
sexo(ana, ’feminino’).
38/40