-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathimobiliaria.als
117 lines (87 loc) · 2.13 KB
/
imobiliaria.als
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
module imobiliaria
----------------------------Assinaturas----------------------------
sig Gerente {
supervisiona: one Subgerente
}
sig Vendedor{
vende: #Imovel = 3
}
sig Subgerente extends Gerente{
fiscaliza: #Vendedor < 4
}
abstract sig Imovel{
inspecao : set inspecao
}
sig Vendas{
}
----------------------------Fatos----------------------------
fact FatosGerais {
all v : Vendedor | #vende = 3
all s :Subgerente | one s.~supervisiona
Existe um gerente que esta ligado a um subgerente
--some g:Gerente | one s:Subgerente
}
-- todo subgerente esta ligado a um gerente
fact {
all s: Subgerente | one s.~supervisiona
}
-- cada imovel esta ligado a um vendedor:
fact {
all i: Imovel | one i.~vende
}
fact ImovelEstaEmVistoria {
all i : imovel | imovelEmVistoria[i]
}
fact ImovelEmLimpeza {
all i : imovel | imovelEmLimpeza[i]
}
----------------------------Funcoes----------------------------
fun getSubgerente[v: Vendedor] : set Subgerente {
v.fiscaliza
}
fun getImovel[v: Vendedor] : set Imovel {
v.vende
}
fun getGerente[s: Subgerente]: set Gerente {
s.supervisiona
}
----------------------------Predicados----------------------------
pred temNoMaxUmSubgerente[s: Subgerente] {
lone s.~fiscaliza
}
--verifica se o imovel está em vistoria
pred imovelEmVistoria[i : imovel]{
#(i.inspecao) <=3
}
-- verifica se o imovel está em limpeza
pred imovelEmLimpeza[i : imovel]{
#(i.inspecao) >= 4
}
pred GerentePorSubgerente [g : Gerente] {
one g.~supervisiona
}
pred todoSubgerenteTemTresVendedores[] {
all s: Subgerente | #s.supervisiona = 3
}
pred todoImovelTemUmVendedor[] {
all i: Imovel | one vende
}
----------------------------Asserts----------------------------
assert temGerente{
some g: Gerente | #getGerente[g] > 0
}
assert todoSubgerenteTemGerente {
all s: Subgerente | #getGerente[s] > 0
}
assert todoVendedorTemUmSubgerente {
all v: Vendedor | #getSubgerente[v] > 0
}
assert todoImovelTemUmVendedor {
all v:Vendedor | #getImovel[v] > 0
}
check todoSubgerenteTemGerente
check todoImovelTemUmVendedor
check todoVendedorTemUmSubgerente
check temGerente
pred show[]{}
run show for 3