18 const auto &values = expr.
values();
22 "let must have the type of the 'where' operand");
25 for(
auto &binding :
make_range(variables).zip(values))
28 binding.first.type() == binding.second.type(),
29 "let value must have the type of the let symbol");
37 std::vector<bvt> converted_values;
38 converted_values.reserve(variables.size());
40 for(
auto &value : values)
43 converted_values.emplace_back();
52 for(
const auto &binding :
make_range(fresh_variables).zip(converted_values))
54 bool is_boolean = binding.first.type().id() == ID_bool;
55 const auto &identifier = binding.first.get_identifier();
60 DATA_INVARIANT(binding.second.size() == 1,
"boolean values have one bit");
61 symbols[identifier] = binding.second[0];
70 for(
const auto &pair :
make_range(variables).zip(fresh_variables))
71 replace_symbol.
insert(pair.first, pair.second);
75 replace_symbol(where_renamed);
81 for(
const auto &entry : fresh_variables)
83 const auto &type = entry.type();
84 if(type.id() == ID_bool)
85 symbols.erase(entry.get_identifier());