evaluate method

  1. @override
List<Fact> evaluate(
  1. Map<String, List<List<Object>>> facts,
  2. Map<String, List<List<Object>>> derived
)
override

Evaluates the rule and returns derived facts.

Implementation

@override
List<Fact> evaluate(
  Map<String, List<List<Object>>> facts,
  Map<String, List<List<Object>>> derived,
) {
  // This is a stratified rule - only evaluate after Mutable is complete
  final result = <Fact>[];
  final allocs = facts['Alloc'] ?? [];
  final mutable = {...?facts['Mutable'], ...?derived['Mutable']};

  // Convert mutable to set for efficient lookup
  final mutableHeaps = <Object>{};
  for (final m in mutable) {
    mutableHeaps.add(m[0]);
  }

  for (final alloc in allocs) {
    final heap = alloc[1];
    if (!mutableHeaps.contains(heap)) {
      result.add(Fact('DeepImmutable', [heap]));
    }
  }

  return result;
}