Project

General

Profile

« Previous | Next » 

Revision ebbe2fc3

Added by Lélio Brun over 3 years ago

state variables ar not free

View differences:

src/optimize_machine.ml
134 134
         ( e_val g,
135 135
           List.map (fun (l, il) -> l, List.map (eliminate m elim) il) hl ))
136 136

  
137
let rec fv_value s v =
137
let rec fv_value m s v =
138 138
  match v.value_desc with
139 139
  | Var v ->
140
    VSet.add v s
140
    if is_memory m v then s else VSet.add v s
141 141
  | Fun (_, vl)
142 142
  | Array vl ->
143
    List.fold_left fv_value s vl
143
    List.fold_left (fv_value m) s vl
144 144
  | Access (v1, v2)
145 145
  | Power (v1, v2) ->
146
    fv_value (fv_value s v1) v2
146
    fv_value m (fv_value m s v1) v2
147 147
  | _ -> s
148 148

  
149
let fv_expr s = function
150
  | Val v -> fv_value s v
151
  | Var v -> VSet.add v s
149
let fv_expr m s = function
150
  | Val v -> fv_value m s v
151
  | Var v ->
152
    if is_memory m v then s else VSet.add v s
152 153
  | _ -> s
153 154

  
154
let fv_predicate s = function
155
let fv_predicate m s = function
155 156
  | Transition (_, _, _, _, vars, _, _, _) ->
156
    List.fold_left fv_expr s vars
157
    List.fold_left (fv_expr m) s vars
157 158
  | _ -> s
158 159

  
159
let rec fv_formula s = function
160
let rec fv_formula m s = function
160 161
  | Equal (e1, e2)
161 162
  | GEqual (e1, e2) ->
162
    fv_expr (fv_expr s e1) e2
163
    fv_expr m (fv_expr m s e1) e2
163 164
  | And f
164 165
  | Or f ->
165
    List.fold_left fv_formula s f
166
    List.fold_left (fv_formula m) s f
166 167
  | Imply (a, b)
167 168
  | ExistsMem (_, a, b) ->
168
    fv_formula (fv_formula s a) b
169
    fv_formula m (fv_formula m s a) b
169 170
  | Exists (xs, a)
170 171
  | Forall (xs, a) ->
171
    VSet.filter (fun v -> not (List.mem v xs)) (fv_formula s a)
172
    VSet.filter (fun v -> not (List.mem v xs)) (fv_formula m s a)
172 173
  | Ternary (e, a, b) ->
173
    fv_expr (fv_formula (fv_formula s a) b) e
174
    fv_expr m (fv_formula m (fv_formula m s a) b) e
174 175
  | Predicate p ->
175
    fv_predicate s p
176
    fv_predicate m s p
176 177
  | Value v ->
177
    fv_value s v
178
    fv_value m s v
178 179
  | _ -> s
179 180

  
180 181
let eliminate_transition m elim t =
181 182
  let tvars = List.filter (fun vd -> not (IMap.mem vd.var_id elim)) t.tvars in
182 183
  let tformula = eliminate_formula m elim t.tformula in
183
  let fv = VSet.(elements (diff (fv_formula empty tformula) (of_list tvars))) in
184
  let fv = VSet.(elements (diff (fv_formula m empty tformula) (of_list tvars))) in
184 185
  let tformula = Exists (fv, tformula) in
185 186
  { t with
186 187
    tvars;

Also available in: Unified diff