Modelos de sistema: Larch Linguagem de especificação algébrica: Larch Arthur Bispo de Castro...

Post on 22-Apr-2015

117 views 0 download

Transcript of Modelos de sistema: Larch Linguagem de especificação algébrica: Larch Arthur Bispo de Castro...

Modelos de sistema:

Linguagem de

especificação algébrica: LarchLarch

Arthur Bispo de Castro ra992659

Luciano Antonio Digiampietri ra992075

Tópicos abordados:

Histórico Modelo utilizado Ferramentas associadas Aspectos do sistema cobertos pelo modelo Aplicação ao estudo de caso Conclusão (pontos fracos e fortes)

2

Histórico

1973 – Steve Zilles apresentou 3 operações para conjuntos;

1974 – especificação algébrica + operacional; 1980 – especificação algébrica em duas

camadas; 1990 – softwares com suporte a Larch (para

verificação de especificações); Colaboradores: DARPA, NSF, the Digital

Equipment Corporation e Xerox3

Modelo utilizado

Especificação como meio de comunicação. Especificação dem duas camadas:

– Larch Shared Language (LSL) – Bottom tier construções básicas

– Larch interface languages (BISL) – Top tier detalhes do programa

4

Modelo utilizado (II)

Larch Shared Language (LSL)– Enfatiza o uso de abstrações e especificação de

tipos abstratos de dados;– Permite melhor reuso;– Semanticamente mais simples;– Mais fácil de fazer e checar;

5

Modelo utilizado (III)

Larch interface languages (BISL) Define as interfaces entre os componentes do

programa; Deve conter as informações necessárias para a

implementação do programa;

– Estados do programa– Especificação dos procedimentos

6

Diferenças entre LSL e BISL

LSL– Definição de teorias;– Operações sobre teorias;– Definições de operadores.

BISL– Estado;– Controle;– Estruturas de programação;– Implementação.

7

Ferramentas associadas

LP, the Larch proof assistant– Faz provas de especificações em Larch para multi-

tipos de dados, cujos axiomas utilizem de lógica de primeira ordem;

SPLINT– provador de programas em C que utiliza o Larch

para as provas;

8

Aspectos do sistema cobertos pelo modelo

Cobertura:– definições de tipos;– estados (ações sobre estados);– operações.

Não oferece cobertura :– interfaces com usuário;– requisitos de desempenho;– requisitos de hardware (limitações de disco rígido, etc);

9

Aplicação ao estudo de casoEspecificação simplificada – elevador (I)

includes Listaincludes Sentidoincludes Andarincludes Emergenciaincludes SomaSubtrai

declare Elevador tuple of Andar, Sentido, List, Emergenciadeclare variables a1, a2: Andar, l1: List, emergencia : e1;declare operators novo : -> Elevador apertar_botao_andar : Andar, Elevador -> Elevador apertar_botao_emergencia : Elevador -> Elevador subir : Elevador -> Elevador descer : Elevador -> Elevador ..

10

Aplicação ao estudo de casoEspecificação simplificada – elevador (II)

% Axions

assert sort Elevador genereted by novo, apertar_botao_andar,

apertar_botao_emergencia apertar_botao_andar(a2, (a1, s1, l1, e1)) = (if pertence(a2, l1) then

(a1, s1, l1, e1) else (a1, s1, cons(a2, l1), e1))); apertar_botao_emergencia(a1, s1, l1, e1) = (a1, s1, l1, sim); subir(a1, s1, l1, e1) = (if s1 == descer \/ e1 == sim \/ a1 ==

ultimo_andar then (a1, s1, l1, e1) else (soma_1(a1), s1, l1, e1); descer(a1, s1, l1, e1) = (if s1 == subir \/ e1 == sim \/ a1 ==

primeiro_andar then (a1, s1, l1, e1) else (subtrai_1(a1), s1, l1, e1);

..

complete

11

Aplicação ao estudo de casoEspecificação completa – lista (I)

set script listaset log listaclearset trace 0set name lista

declare sorts Elemento, Listadeclare variables e, e1: Elemento, x, y, z: Listadeclare operators null : -> Lista cons : Elemento, Lista -> Lista append : Lista, Lista -> Lista rev : Lista -> Lista pertence : Elemento, Lista -> Bool ..

12

Aplicação ao estudo de casoEspecificação completa – lista (II)

% Axiomas

assert sort Lista generated by null, cons; append(null, x) = x; append(cons(e, y), z) = cons(e, append(y, z)); rev(null) = null; rev(cons(e, y)) = append(rev(y), cons(e, null)); cons(e, x) ~= null; cons(e1, x) = cons(e, y) <=> e = e1 /\ x = y; pertence(e,null) = true; pertence(e,cons(e1,x)) = (if e = e1 then true else

pertence(e,x)) ..

complete

13

Aplicação ao estudo de casoEspecificação completa – lista (III)

% Teoremas

set name theoremassert rev(rev(x)) = xcompletestatisticsdelete theoremcompleteassert append(append(x, y), z) = append(x, append(y, z))completeassert rev(append(x, y)) = append(rev(y), rev(x))completestatisticsassert pertence(e, append(x,y)) = pertence(e,x) \/

pertence(e,y)completestatistics14

Aplicação ao estudo de casoProva completa – lista (I)

LP (the Larch Prover), Release 3.1b (98/06/09) logging to `/mnt/lista.lplog' on

14 May 2003 19:03:49.LP0.1.5: clearLP0.1.6: set trace 0The trace-level is now 0.LP0.1.7: set name listaThe name-prefix is now `lista'.LP0.1.8: LP0.1.9: declare sorts Elemento, ListaLP0.1.10: declare variables e, e1: Elemento, x, y, z: ListaLP0.1.11: declare operators null : -> Lista cons : Elemento, Lista -> Lista append : Lista, Lista -> Lista rev : Lista -> Lista pertence : Elemento, Lista -> Bool ..

15

Aplicação ao estudo de caso Prova completa – lista (II)

LP0.1.12: LP0.1.13: % AxiomasLP0.1.14: LP0.1.15: assert sort Lista generated by null, cons; append(null, x) = x; append(cons(e, y), z) = cons(e, append(y, z)); rev(null) = null; rev(cons(e, y)) = append(rev(y), cons(e, null)); cons(e, x) ~= null; cons(e1, x) = cons(e, y) <=> e = e1 /\ x = y; pertence(e,null) = true; pertence(e,cons(e1,x)) = (if e = e1 then true else

pertence(e,x)) ..LP0.1.16: LP0.1.17: completeThe system is complete.LP0.1.18: 16

Aplicação ao estudo de casoProva completa – lista (III)

LP0.1.19: % TeoremasLP0.1.20: LP0.1.21: set name theoremThe name-prefix is now `theorem'.LP0.1.22: assert rev(rev(x)) = xLP0.1.23: completeThe system is complete.LP0.1.24: statisticsStatistics as of 14 May 2003 19:03:49.

Recent Success Failure Total------ Count Time Count Time TimeOrdering 11 0.01 9 0.00 0.01Rewriting 43 0.02 273 0.01 0.03Deductions 0 0.00 9 0.00 0.00Unification 20 0.02 41 0.00 0.02Prover 0.02GC's 1Total time 0.1417

Conclusão (pontos fracos e fortes)

As especificações em Larch enfatizam concisão e clareza ao invés de execução;

Para execução de algumas especificações se faz necessário que façamos asserções redundantes para checagem mecânica;

Necessidade de requisição manual de provas (o usuário deve elaborar os teoremas a serem provados).

18

Bibliografia

Larch: Languages and Tools for Formal Specification, J.V. Guttang and J.J. Horning

Larch Home Page http://nms.lcs.mit.edu/Larch/ Archive-name: larch-faq

http://www.cs.iastate.edu/~leavens/larch-faq.html An Introduction to Larch:

http://www.cs.utah.edu/~sjt/seminar/larch/

19OBRIGADO !

Exemplo LSL - Tabela

Table: trait

includes Integer

introduces

new: -> Tab

add: -> Tab, Ind, Val -> Tab

__: Ind, Tab -> Bool

lookup: Tab, Ind -> Val

size: Tab -> Int

asserts i, i1: Ind, v: Val, t: Tab;

¬(i new);

i add(t, i1, v) == i = i1 i t

lookup(add(t,i,v), i1) ==

if i = i1 then v else lookup(t, i1);

size(new) == 0

size(add(t,i,v)) ==

if i t then size(t) else size(t) + 1

Exemplo LCL - Tabela

mutable type table;

use Table(table for Tab, char for Ind, char for Val, int for Int);

Constant int maxTabSize;

table table_create(void){

ensures result’ = new fresh(result);

}

bool table_add(table t, char i, char c){

modifies t;

ensures result = (size(t^) < maxTabSize i t^)

(if result then t’ = add(t^,i,c) else t’ = t^);

}

char table_read(table t, char i){

requires i t^;

ensures result = lookup(t^,i);

}

elevador.lp

includes Lista

includes Sentido

includes Andar

includes Emergencia

includes SomaSubtrai

declare Elevador tuple of Andar, Sentido, List, Emergencia

declare variables a1, a2: Andar, l1: List, emergencia : e1;

declare operators

novo : -> Elevador

apertar_botao_andar : Andar, Elevador -> Elevador

apertar_botao_emergencia : Elevador -> Elevador

subir : Elevador -> Elevador

descer : Elevador -> Elevador

..

% Axions

assert

sort Elevador genereted by novo, apertar_botao_andar, apertar_botao_emergencia

apertar_botao_andar(a2, (a1, s1, l1, e1)) = (if pertence(a2, l1) then (a1, s1, l1, e1) else (a1, s1, cons(a2, l1), e1)));

apertar_botao_emergencia(a1, s1, l1, e1) = (a1, s1, l1, sim);

subir(a1, s1, l1, e1) = (if s1 == descer \/ e1 == sim \/ a1 == ultimo_andar then (a1, s1, l1, e1) else (soma_1(a1), s1, l1, e1);

descer(a1, s1, l1, e1) = (if s1 == subir \/ e1 == sim \/ a1 == primeiro_andar then (a1, s1, l1, e1) else (subtrai_1(a1), s1, l1, e1);

..

complete

lista.lp

set script lista

set log lista

clear

set trace 0

set name lista

declare sorts Elemento, Lista

declare variables e, e1: Elemento, x, y, z: Lista

declare operators

null : -> Lista

cons : Elemento, Lista -> Lista

append : Lista, Lista -> Lista

rev : Lista -> Lista

pertence : Elemento, Lista -> Bool

..

% Axiomas

assert

sort Lista generated by null, cons;

append(null, x) = x;

append(cons(e, y), z) = cons(e, append(y, z));

rev(null) = null;

rev(cons(e, y)) = append(rev(y), cons(e, null));

cons(e, x) ~= null;

cons(e1, x) = cons(e, y) <=> e = e1 /\ x = y;

pertence(e,null) = true;

% pertence(e,cons(e,null)) = true;

pertence(e,cons(e1,x)) = (if e = e1 then true else pertence(e,x))

..

complete

% Teoremas

set name theorem

assert rev(rev(x)) = x

complete

statistics

delete theorem

complete

assert append(append(x, y), z) = append(x, append(y, z))

complete

assert rev(append(x, y)) = append(rev(y), rev(x))

complete

statistics

assert pertence(e, append(x,y)) = pertence(e,x) \/ pertence(e,y)

complete

statistics

lista.lplog

LP (the Larch Prover), Release 3.1b (98/06/09) logging to `/mnt/lista.lplog' on

14 May 2003 19:03:49.

LP0.1.5: clear

LP0.1.6: set trace 0

The trace-level is now 0.

LP0.1.7: set name lista

The name-prefix is now `lista'.

LP0.1.8:

LP0.1.9: declare sorts Elemento, Lista

LP0.1.10: declare variables e, e1: Elemento, x, y, z: Lista

LP0.1.11: declare operators

null : -> Lista

cons : Elemento, Lista -> Lista

append : Lista, Lista -> Lista

rev : Lista -> Lista

pertence : Elemento, Lista -> Bool

..

LP0.1.12:

LP0.1.13: % Axiomas

LP0.1.14:

LP0.1.15: assert

sort Lista generated by null, cons;

append(null, x) = x;

append(cons(e, y), z) = cons(e, append(y, z));

rev(null) = null;

rev(cons(e, y)) = append(rev(y), cons(e, null));

cons(e, x) ~= null;

cons(e1, x) = cons(e, y) <=> e = e1 /\ x = y;

pertence(e,null) = true;

% pertence(e,cons(e,null)) = true;

pertence(e,cons(e1,x)) = (if e = e1 then true else pertence(e,x))

..

LP0.1.16:

LP0.1.17: complete

The system is complete.

LP0.1.18:

LP0.1.19: % Teoremas

LP0.1.20:

LP0.1.21: set name theorem

The name-prefix is now `theorem'.

LP0.1.22: assert rev(rev(x)) = x

LP0.1.23: complete

The system is complete.

LP0.1.24: statistics

Statistics as of 14 May 2003 19:03:49.

Recent Success Failure Total

------ Count Time Count Time Time

Ordering 11 0.01 9 0.00 0.01

Rewriting 43 0.02 273 0.01 0.03

Deductions 0 0.00 9 0.00 0.00

Unification 20 0.02 41 0.00 0.02

Prover 0.02

GC's 1

Total time 0.14

Heap size = 135,379 words

Free space = 5,728,821 words

LP0.1.25: delete theorem

LP0.1.26: complete

The system is complete.

LP0.1.27: assert append(append(x, y), z) = append(x, append(y, z))

LP0.1.28: complete

The system is complete.

LP0.1.29: assert rev(append(x, y)) = append(rev(y), rev(x))

LP0.1.30: complete

The system is complete.

LP0.1.31: statistics

Statistics as of 14 May 2003 19:03:49.

Recent Success Failure Total

------ Count Time Count Time Time

Ordering 3 0.00 1 0.00 0.00

Rewriting 53 0.01 154 0.00 0.01

Deductions 0 0.00 3 0.00 0.00

Unification 23 0.02 74 0.01 0.03

Prover 0.00

GC's 1

Total time 0.08

Cumulative Success Failure Total

---------- Count Time Count Time Time

Ordering 14 0.01 10 0.00 0.01

Rewriting 96 0.03 427 0.01 0.04

Deductions 0 0.00 12 0.00 0.00

Unification 43 0.04 115 0.01 0.05

Prover 0.02

GC's 2

Total time 0.22

Heap size = 139,495 words

Free space = 5,727,740 words

LP0.1.32: assert pertence(e, append(x,y)) = pertence(e,x) \/ pertence(e,y)

LP0.1.33: complete

The system is complete.

LP0.1.34: statistics

Statistics as of 14 May 2003 19:03:49.

Recent Success Failure Total

------ Count Time Count Time Time

Ordering 2 0.00 0 0.00 0.00

Rewriting 18 0.00 82 0.00 0.00

Deductions 0 0.00 2 0.00 0.00

Unification 3 0.01 10 0.00 0.01

Prover 0.00

GC's 1

Total time 0.07

Cumulative Success Failure Total

---------- Count Time Count Time Time

Ordering 16 0.01 10 0.00 0.01

Rewriting 114 0.03 509 0.01 0.04

Deductions 0 0.00 14 0.00 0.00

Unification 46 0.05 125 0.01 0.06

Prover 0.02

GC's 3

Total time 0.29

Heap size = 138,145 words

Free space = 5,728,056 words

End of input from file `/mnt/excalibur-download/lista.lp'.

End of input from file `command line arguments'.