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'.