Você está na página 1de 14

Uma linguagem de especificação formal simplificada

Adolfo Neto
Departamento Acadêmico de Informática (DAINF)
Universidade Tecnológica Federal do Paraná (UTFPR)

Versão 1.1
15 de junho de 2010

Sumário
1 Introdução 3

2 Estrutura da Seção “Especificação Formal” 3

3 Descrição detalhada de cada subseção 3


3.1 Tipos do sistema . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.1.1 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 Nome do sistema e descrição dos itens do estado do sistema . 5
3.2.1 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.3 Inicialização do estado do sistema . . . . . . . . . . . . . . . . 5
3.3.1 Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.4 Funções definidas . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.4.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.5 Predicados definidos . . . . . . . . . . . . . . . . . . . . . . . 6
3.5.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.6 Especificação formal das operações . . . . . . . . . . . . . . . 6
3.6.1 Exemplos . . . . . . . . . . . . . . . . . . . . . . . . . 7

4 Detalhes adicionais 8
4.1 Sı́mbolos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

A Exemplo Completo: Sistema Acadêmico 11


A.1 Descrição Textual . . . . . . . . . . . . . . . . . . . . . . . . . 11
A.1.1 Cadastrar Aluno . . . . . . . . . . . . . . . . . . . . . 11
A.1.2 Cadastrar Professor . . . . . . . . . . . . . . . . . . . 11
A.1.3 Cadastrar Turma . . . . . . . . . . . . . . . . . . . . . 11
A.1.4 Matricular Aluno em Turma . . . . . . . . . . . . . . 11
A.1.5 Listar Nomes dos Alunos . . . . . . . . . . . . . . . . 11
A.2 Especificação Formal . . . . . . . . . . . . . . . . . . . . . . . 12

1
A.2.1 Tipos do sistema . . . . . . . . . . . . . . . . . . . . . 12
A.2.2 Estado do sistema . . . . . . . . . . . . . . . . . . . . 12
A.2.3 Funções e predicados definidos . . . . . . . . . . . . . 12
A.2.4 Especificação formal das operações . . . . . . . . . . . 13

B Histórico de Revisões 13
B.1 Mudanças na versão 1.1 . . . . . . . . . . . . . . . . . . . . . 13

2
1 Introdução
O objetivo deste documento é apresentar uma linguagem de especificação
formal simplificada que é uma extensão da linguagem apresentada em [1] e
usa também parte da notação da linguagem de especificação Z [2]. Esta lin-
guagem é usada por alunos do primeiro perı́odo dos cursos de Engenharia
de Computação e Sistemas de Informação da UTFPR na especificação
formal de partes dos sistemas implementados pelos próprios alunos na dis-
ciplina “Fundamentos de Programação 1”. A especificação formal faz parte
da avaliação da disciplina “Lógica para Computação”.

2 Estrutura da Seção “Especificação Formal”


O documento de especificação do sistema poderá iniciar com uma seção
contendo a “Descrição textual”, ou seja, a descrição das funcionalidades do
sistema como texto livre em lı́ngua natural.
Após esta seção deverá vir a seção sobre a especificação formal que será
dividida nas seguintes subseções:

1. Tipos do sistema

2. Estado do sistema

(a) Nome do sistema e descrição dos itens do estado do sistema


(b) Inicialização do estado do sistema

3. Funções e predicados definidos

(a) Funções definidas


(b) Predicados definidos

4. Especificação formal das operações

3 Descrição detalhada de cada subseção


3.1 Tipos do sistema
Na subseção tipos do sistema são definidos os tipos dos repositórios (depósitos
de dados) e das variáveis utilizadas nas operações.
Alguns tipos são tipos básicos e não precisam ser definidos, apenas lis-
tados:

• INTEIRO: números inteiros

• REAL: números reais

3
• CARACTER: caracteres

• STRING: cadeias de caracteres

• LÓGICO: valores lógicos (booleanos)

• DATA: permite armazenar dia, mês e ano

• HORA: permite armazenar hora, minuto e segundo

Podemos usar construtores de tipos para construir novos tipos a partir


dos tipos básicos e de tipos não-básicos:

• Tupla (sı́mbolos: “h” e “i”)

• Função/Vetor (sı́mbolo: “→”)

• Lista (sı́mbolos: “[” e “]”)

• Conjunto (sı́mbolo “P”)

• Produto cartesiano (sı́mbolo “×”)

3.1.1 Exemplo
• Tipos básicos utilizados: INTEIRO, REAL, STRING, LÓGICO

• ALUNO = hcódigo: INTEIRO, nome: STRING, coeficiente: REALi

• PROFESSOR = hcódigo: INTEIRO, nome: STRING, salário: REALi

• TURMA = hcódigo: INTEIRO, nome: STRING, códigoProfessor: IN-


TEIRO, códigosAlunos: [INTEIRO], limite: INTEIROi

• SOLICITACAO-MATRICULA = hcódigoAluno: INTEIRO, códigoTurma:


INTEIROi

• DISCIPLINAS = P STRING

• FAIXAS-SALARIAIS = INTEIRO → REAL

• MATRIZ = INTEIRO × INTEIRO → INTEIRO

Obs.1: Se tabela for definido como sendo do tipo FAIXAS-SALARIAIS


(“tabela: FAIXAS-SALARIAIS”), tabela(1) refere-se ao primeiro item de
tabela.
Obs.2: Se mat for definido como sendo do tipo MATRIZ (“mat: MA-
TRIZ”), mat(2,3) refere-se ao item na linha 2, coluna 3 de mat.

4
3.2 Nome do sistema e descrição dos itens do estado do sis-
tema
Nesta parte primeiramente é definido o nome do sistema. Em seguida são
listadas as variáveis (em geral representando repositórios) que compõem o
estado do sistema. Por último podem ser listados alguns invariantes (Inv)
das variáveis de estado.

3.2.1 Exemplo
SistemaAcadêmico
• alunos: [ALUNO]
• professores: [PROFESSOR]
• turmas: [TURMA]
Inv:
• alunos ∩ professores = ∅

3.3 Inicialização do estado do sistema


Nesta parte todas as variáveis que fazem parte do estado do sistema devem
receber valores iniciais.

3.3.1 Exemplo
InitSistemaAcadêmico
SistemaAcadêmico
• alunos=∅
• professores=∅
• turmas=∅

3.4 Funções definidas


Nesta parte podem ser ser descritas textualmente algumas funções que, por
motivos de simplicidade, não serão especificadas formalmente.

3.4.1 Exemplos
• dados(ent,cam): retorna uma lista contendo apenas os valores distintos
do campo cam da entidade ent.
• obter(ent, val, cam): retorna o objeto armazenado na entidade ent
cujo valor para o campo cam é val.

5
3.5 Predicados definidos
Nesta parte podem ser descritos textualmente alguns predicados que, por
motivos de simplicidade, não serão especificadas formalmente.

3.5.1 Exemplos
• string vazia(str: STRING): retorna verdadeiro se a string str for a
string vazia e falso em caso contrário.

• cpf válido(cpf: INTEIRO): retorna verdadeiro se o inteiro cpf um CPF


válido de acordo com as regras de formação da Receita Federal (dı́gitos
verificadores), e falso em caso contrário.

• novo(var.cam, ent, cam): retorna verdadeiro se o valor do campo cam


na variável var é diferente de todos os valores do mesmo campo na
entidade ent. Falso em caso contrário. Usado quando o valor de um
campo é criado por uma operação.

• contém(str1: STRING, str2: STRING): retorna verdadeiro se a string


str1 contém a string str2 e falso em caso contrário.

3.6 Especificação formal das operações


As operações executadas pelo sistema podem ser descritas nesta seção. Por
motivos de tempo, nos trabalhos que os alunos fazem para a disciplina Lógica
para Computação nem todas as operações implementadas no sistema preci-
sam ser especificadas formalmente.
A especificação formal de cada processo pode ser dividida em quatro
cinco partes:

1. Linha inicial contendo o nome do sistema e, antes deste, um sı́mbolo


descrevendo se o estado do sistema será alterado (∆) ou não (Ξ).

2. Variáveis de entrada (“?”) e saı́da (“!”) da operação.

3. Pré-condições

4. Pós-condições

5. Invariantes (opcional)

As pré-condições, pós-condições e invariantes consistem em fórmulas


da lógica clássica de predicados estendida com notações de conjuntos e as
funções e os predicados definidos. Antes de cada fórmula deve ser colocado
um comentário descrevendo a fórmula, prefixado por “//”.

6
3.6.1 Exemplos
2.3.31 MatricularAlunoEmTurma
∆SistemaAcadêmico
códigoAluno?: INTEIRO
códigoTurma?: INTEIRO
resposta!: LÓGICO
Pré-condições:
// O código do aluno é válido
códigoAluno? ∈ dados(alunos, código)
// O código da turma é válido
códigoTurma? ∈ dados(turmas, código)
// a turma ainda tem vagas
obter(turmas, códigoTurma?, código).limite >
#obter(turmas, códigoTurma?, código).códigosAlunos
// o aluno não está matriculado na turma
códigoAluno? 6∈ obter(turmas, códigoTurma?, código).códigosAlunos
Pós-condições:
// a resposta é que o aluno foi matriculado na turma
resposta! = verdadeiro
// o aluno foi matriculado na turma
obter(turmas’, códigoTurma?, códigosAlunos) =
obter(turmas, códigoTurma?, códigosAlunos) ∪ {códigoAluno?}
// a quantidade de alunos na turma foi incrementada em 1
// (tendo em vista a fórmula anterior, esta linha é desnecessária
// apenas foi incluı́da como exemplo)
#obter(turmas’, códigoTurma?, código).códigosAlunos =
#obter(turmas, códigoTurma?, código).códigosAlunos + 1

2.3.92 ListarNomesAlunos
ΞSistemaAcadêmico
resposta!: STRING
Pré-condições:
Pós-condições:
// A resposta contém o nome de todos os alunos
∀x(x ∈ alunos → contém(resposta!, x.nome))
1
Este número é apenas um exemplo.
2
Este número é apenas um exemplo.

7
4 Detalhes adicionais
4.1 Sı́mbolos
• ∆: Indica que a operação pode alterar o estado do sistema. Colocado
antes do nome do sistema no começo da descrição de uma operação,
logo após o nome da operação.

• Ξ: Indica que a operação não altera o estado do sistema. Colocado


antes do nome do sistema no começo da descrição de uma operação,
logo após o nome da operação.

• ?: Após o nome de uma variável de uma operação, indica que se trata


de uma variável de entrada. Exemplo: código?: INTEIRO é uma
variável de entrada do tipo INTEIRO.

• !: Após o nome de uma variável de uma operação, indica que se trata


de uma variável de saı́da. Exemplo: código!: INTEIRO é uma variável
de saı́da do tipo INTEIRO.

• ’: Após o nome de um repositório, indica que se trata do conteúdo do


repositório após a execução da operação. Somente pode ser usado nas
pós-condições. Exemplo: alunos’ refere-se ao repositório alunos após
a execução de uma operação.

• #: Retorna a quantidade de elementos de uma lista ou conjunto.


Exemplo: se códigosAlunos?:[INTEIRO] for declarado como uma lista
de alunos, #códigosAlunos? vai ter como valor a quantidade de ele-
mentos nesta lista.

• []: representa a criação de uma lista.

• ∈: representa a pertinência de um objeto a uma lista/entidade/repositório.


Notação: “objeto ∈ lista/entidade”.

• ∈
6 : representa a não-pertinência de um objeto a uma lista/entidade/repositório.
Notação: “objeto 6∈ lista/entidade”.

• ∅: representa o conjunto vazio.

• ∪: representa a união de dois conjuntos ou entidades. Notação: A ∪ B.

• ∩: representa a interseção de dois conjuntos ou entidades. Notação:


A ∩ B.

• \: representa a diferença de dois conjuntos ou entidades. Notação:


A \ B.

8
• “.”: Permite obter o valor do campo de um objeto. Notação: “ob-
jeto.campo”. Obs.: não pode ser aplicada diretamente a repositórios.

• Sı́mbolos lógicos (quantificadores e conectivos): ∀, ∃, ¬, ∧, ∨, → (veja


o significado em [1], capı́tulos 1 e 4).

• Sı́mbolos aritméticos: =, 6=, >, ≥, <, ≤. Representam predicados binários


que podem ser utilizados com o significado usual.

9
Referências
[1] Flávio S. C. da Silva, Marcelo Finger, and Ana C. V. de Melo. Lógica
para Computação. Thomson Learning, São Paulo, 2006.

[2] Spivey, J. M. The Z Notation. Prentice Hall. Disponı́vel em: hhttp://


spivey.oriel.ox.ac.uk/~mike/zrm/i. Acesso em: 10 jun. 2010., 2001.

10
A Exemplo Completo: Sistema Acadêmico
A.1 Descrição Textual
Este é o sistema acadêmico de uma universidade fictı́cia. A universidade
tem alunos, professores e turmas. O sistema tem as seguintes operações:

A.1.1 Cadastrar Aluno


O sistema recebe como entrada o nome do aluno e cadastra um novo aluno
no repositório de alunos com um novo código (gerado automaticamente pelo
sistema) e com coeficiente zero. A saı́da desta opearação é o objeto do tipo
“aluno” que foi cadastrado.

A.1.2 Cadastrar Professor


O sistema recebe como entrada o nome do professor e o salário do professor
e cadastra um novo professor no repositório de professores com um novo
código (gerado automaticamente pelo sistema). A saı́da desta opearação é
o objeto do tipo “professor” que foi cadastrado.

A.1.3 Cadastrar Turma


O sistema recebe como entrada o nome da turma, o nome do professor
da turma e o limite máximo de alunos na turma. A operação cadastra
uma nova turma no repositório de turmas com um novo código (gerado
automaticamente pelo sistema) e com a lista de códigos de alunos vazia. A
saı́da desta opearação é o objeto do tipo “turma” que foi cadastrado.

A.1.4 Matricular Aluno em Turma


O sistema recebe como entrada o código do aluno e o código da turma. Se os
códigos do aluno e da turma forem válidos, se a turma ainda tiver vagas, e se
o aluno não estiver matriculado na turma, a operação matricula o aluno na
turma. A operação dará como resposta “verdadeiro” se conseguiu matricular
o aluno. Além disso, a lista de alunos matriculados na turma será alterada
(será incluı́do o código do aluno matriculado).

A.1.5 Listar Nomes dos Alunos


Esta operação apenas lista os nomes de todos os alunos cadastrados no
sistema. Não recebe nenhuma entrada e a saı́da é uma cadeia de caracteres,
contendo todos os nomes dos alunos em algum formato.

11
A.2 Especificação Formal
A.2.1 Tipos do sistema
• Tipos básicos utilizados: INTEIRO, REAL, STRING, LÓGICO
• ALUNO = hcódigo: INTEIRO, nome: STRING, coeficiente: REALi
• PROFESSOR = hcódigo: INTEIRO, nome: STRING, salário: REALi
• TURMA = hcódigo: INTEIRO, nome: STRING, códigoProfessor: IN-
TEIRO, códigosAlunos: [INTEIRO], limite: INTEIROi

A.2.2 Estado do sistema


A.2.2.1 Nome do sistema e descrição dos itens do estado do sistema

SistemaAcadêmico
• alunos: [ALUNO]
• professores: [PROFESSOR]
• turmas: [TURMA]
A.2.2.2 Inicialização do estado do sistema

InitSistemaAcadêmico
SistemaAcadêmico
• alunos=∅
• professores=∅
• turmas=∅

A.2.3 Funções e predicados definidos


A.2.3.1 Funções definidas

• dados(ent,cam): retorna uma lista contendo apenas os valores distintos


do campo cam da entidade ent.
• obter(ent, val, cam): retorna o objeto armazenado na entidade ent
cujo valor para o campo cam é val.
A.2.3.2 Predicados definidos

• contém(str1: STRING, str2: STRING): retorna verdadeiro se a string


str1 contém a string str2 e falso em caso contrário.

12
A.2.4 Especificação formal das operações
A.2.4.1 MatricularAlunoEmTurma

∆SistemaAcadêmico
códigoAluno?: INTEIRO
códigoTurma?: INTEIRO
resposta!: LÓGICO
Pré-condições:
// O código do aluno é válido
códigoAluno? ∈ dados(alunos, código)
// O código da turma é válido
códigoTurma? ∈ dados(turmas, código)
// a turma ainda tem vagas
obter(turmas, códigoTurma?, código).limite >
#obter(turmas, códigoTurma?, código).códigosAlunos
// o aluno não está matriculado na turma
códigoAluno? 6∈ obter(turmas, códigoTurma?, código).códigosAlunos
Pós-condições:
// a resposta é que o aluno foi matriculado na turma
resposta! = verdadeiro
// o aluno foi matriculado na turma
obter(turmas’, códigoTurma?, códigosAlunos) =
obter(turmas, códigoTurma?, códigosAlunos) ∪ {códigoAluno?}

A.2.4.2 ListarNomesAlunos

ΞSistemaAcadêmico
resposta!: STRING
Pré-condições:
Pós-condições:
// A resposta contém o nome de todos os alunos
∀x(x ∈ alunos → contém(resposta!, x.nome))

Obs.: Apenas foram especificadas duas operações.

B Histórico de Revisões
B.1 Mudanças na versão 1.1
• Transformação do “resumo” em “Introdução”.

• Inclusão da contagem de versões.

13
• Inclusão do construtor de tipos produto cartesiano.

• Inclusão do sumário.

14

Você também pode gostar