-
Notifications
You must be signed in to change notification settings - Fork 0
/
soLanches.als
122 lines (79 loc) · 2.39 KB
/
soLanches.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
118
119
120
121
122
module SoLanches
//---------------SIGNATURES---------------
one sig SoLanches {
-- Conjunto de comercios do sistema.
comercios: set Comercio
}
sig Comercio {
cardapio: one Cardapio,
}
sig Cardapio {
produtos: set Produto
}
sig Produto {
categoria: one Categoria
}
sig Categoria {}
---------------PRED---------------
-- O comercio esta dentro de uma entidade SoLanches
pred comercioNoSoLanches[c: Comercio, s: SoLanches] {
c in s.comercios
}
-- O produto pertence aos produtos do cardapio passado
pred produtoNoCardapio[p: Produto, c: Cardapio] {
p in c.produtos
}
pred cardapioNoComercio[ca: Cardapio, co: Comercio] {
ca = getCardapioComercio[co]
}
---------------FUNCTIONS---------------
fun getCategoriaProduto[p: Produto]: one Categoria {
p.categoria
}
fun getCardapioComercio[c: Comercio]: one Cardapio {
c.cardapio
}
---------------FACTS---------------
-- Todo comercio esta dentro de uma unica entidade do SoLanches
fact todosComerciosNoSoLanches {
all c: Comercio| one s: SoLanches | comercioNoSoLanches[c, s]
}
-- Todo cardapio esta pertence a um comercio
fact todosCardapiosDentroDeComercio {
all ca: Cardapio | one co: Comercio | ca = getCardapioComercio[co]
}
-- Todo comercio tem um cardapio
fact todosComerciosTemCardapio {
all co: Comercio | one ca: Cardapio | ca = getCardapioComercio[co]
}
-- Todo produto esta dentro de um cardapio
fact todosProdutosDentroDeCardapio {
all p: Produto | one c: Cardapio | produtoNoCardapio[p, c]
}
-- Toda categoria pertence a pelo menos um produto.
fact todaCategoriaDentroDeProduto {
all c: Categoria | some p: Produto | getCategoriaProduto[p] = c
}
---------------ASSERTS---------------
assert todosComerciosNoSolanches {
all c: Comercio | one s: SoLanches | comercioNoSoLanches[c, s]
}
assert cardapioUnico {
all c: Cardapio | all disj co1, co2: Comercio | (cardapioNoComercio[c, co1] => !cardapioNoComercio[c, co2])
}
assert todoProdutoTemCategoria {
all c: Categoria | some p: Produto | c = getCategoriaProduto[p]
}
assert todoProdutoEmCardapios {
all p: Produto | one c: Cardapio | produtoNoCardapio[p, c]
}
assert todoComercioTemUmCardapio {
all co: Comercio | one ca: Cardapio | ca = getCardapioComercio[co]
}
pred show[] {}
run show for 5 Int
check todosComerciosNoSolanches for 10
check cardapioUnico for 10
check todoProdutoTemCategoria for 10
check todoProdutoEmCardapios for 10
check todoComercioTemUmCardapio for 10