let assign ~var value model =
   let rec loop vars =
      match vars with
         (* see if the variable was bound before *)
         ((var2,assig) :: vars) ->
            if var2 =var then
               (* then bind it to the new value *)
               (var2,value) :: vars
            else
               (var2,assig) :: (loop vars)
      |  [] ->
         (* else introduce a new binding*)
         (var,value) :: []
   in
   loop model