@@ -1310,6 +1310,7 @@ tau<BAs...> group_dnf_expression (const tau<BAs...>& fm) {
1310
1310
template <typename ... BAs>
1311
1311
tau<BAs...> simp_general_excluded_middle (const tau<BAs...>& fm) {
1312
1312
assert (is_non_terminal (tau_parser::bf, fm));
1313
+ bool was_simplified = false ;
1313
1314
auto grouped = group_dnf_expression (fm);
1314
1315
auto clauses = get_dnf_bf_clauses (grouped);
1315
1316
for (int_t i = 0 ; i < (int_t )clauses.size (); ++i) {
@@ -1325,6 +1326,7 @@ tau<BAs...> simp_general_excluded_middle (const tau<BAs...>& fm) {
1325
1326
if (cnf[k] == cn) {
1326
1327
cnf.erase (cnf.begin () + k);
1327
1328
has_simp = true ;
1329
+ was_simplified = true ;
1328
1330
if (cnf.empty ()) {
1329
1331
erase_clause = true ;
1330
1332
}
@@ -1343,7 +1345,7 @@ tau<BAs...> simp_general_excluded_middle (const tau<BAs...>& fm) {
1343
1345
--i;
1344
1346
}
1345
1347
}
1346
- return to_dnf2 (build_bf_or<BAs...>(clauses), false );
1348
+ return was_simplified ? to_dnf2 (build_bf_or<BAs...>(clauses), false ) : fm ;
1347
1349
}
1348
1350
1349
1351
// Assume that fm is in DNF (or CNF -> set is_cnf to true)
@@ -1655,10 +1657,14 @@ std::pair<std::vector<int_t>, bool> simplify_path(
1655
1657
clause = replace (clause, changes);
1656
1658
continue ;
1657
1659
}
1660
+ if (sorted_v != v) {
1661
+ std::map<tau<BAs...>, tau<BAs...>> changes = {{v, sorted_v}};
1662
+ clause = replace (clause, changes);
1663
+ }
1658
1664
// There is a new variable
1659
- assert (v != build_wff_eq (_T<BAs...>) && v != build_wff_eq (_F<BAs...>));
1660
- vars.push_back (v );
1661
- var_to_idx.emplace (v , vars.size () - 1 );
1665
+ assert (sorted_v != build_wff_eq (_T<BAs...>) && sorted_v != build_wff_eq (_F<BAs...>));
1666
+ vars.push_back (sorted_v );
1667
+ var_to_idx.emplace (sorted_v , vars.size () - 1 );
1662
1668
}
1663
1669
}
1664
1670
return clause_to_vector (clause, var_to_idx, true , false );
@@ -2083,7 +2089,7 @@ tau<BAs...> to_dnf2(const tau<BAs...>& fm, bool is_wff) {
2083
2089
to_dnf2 (trim (new_fm)->child [1 ], is_wff));
2084
2090
// Perform simplification
2085
2091
if (conj != new_fm)
2086
- new_fm = reduce2 (conj, p::bf);
2092
+ new_fm = reduce2 (conj, p::bf);
2087
2093
} else if (is_child_non_terminal (p::bf_or, new_fm)) {
2088
2094
new_fm = build_bf_or (
2089
2095
to_dnf2 (trim (new_fm)->child [0 ], is_wff),
0 commit comments