@@ -450,14 +450,7 @@ def _add_ranked_closure_constraints(z3, solver, framework, variables):
450450 literal : z3 .Int (f"rank_{ _literal_key (literal )} " )
451451 for literal in literals
452452 }
453- rules_by_consequent = {
454- literal : [
455- rule
456- for rule in sorted (framework .rules , key = repr )
457- if rule .consequent == literal
458- ]
459- for literal in literals
460- }
453+ rules_by_consequent = _rules_by_consequent (framework , literals )
461454
462455 for literal in literals :
463456 solver .add (ranks [literal ] >= 0 , ranks [literal ] <= rank_bound )
@@ -520,14 +513,7 @@ def _add_bitvec_ranked_closure_constraints(z3, solver, framework, variables):
520513 literal : z3 .BitVec (f"rank_bv_{ _literal_key (literal )} " , rank_bits )
521514 for literal in literals
522515 }
523- rules_by_consequent = {
524- literal : [
525- rule
526- for rule in sorted (framework .rules , key = repr )
527- if rule .consequent == literal
528- ]
529- for literal in literals
530- }
516+ rules_by_consequent = _rules_by_consequent (framework , literals )
531517
532518 for literal in literals :
533519 solver .add (z3 .ULE (ranks [literal ], rank_bound_value ))
@@ -577,6 +563,16 @@ def _add_bitvec_ranked_closure_constraints(z3, solver, framework, variables):
577563 return derived
578564
579565
566+ def _rules_by_consequent (framework : ABAFramework , literals : tuple [Literal , ...]):
567+ grouped : dict [Literal , list [Rule ]] = {literal : [] for literal in literals }
568+ for rule in sorted (framework .rules , key = repr ):
569+ grouped [rule .consequent ].append (rule )
570+ return {
571+ literal : tuple (rules )
572+ for literal , rules in grouped .items ()
573+ }
574+
575+
580576class _SupportState :
581577 def __init__ (
582578 self ,
0 commit comments