6 use List::Util qw(reduce);
11 handles => [ qw(add_predicate add_rule) ],
17 has facts => (is => 'ro', default => sub { {} });
19 has observation_policy => (is => 'ro');
22 my ($self, $vars, @terms) = @_;
23 my $rule_set = $self->rule_set;
24 push @terms, map +[ materialize => $_ ], @$vars;
25 my $head = $rule_set->expand_and_link(undef, @terms);
26 my $state = DX::State->new(
32 facts => $self->facts,
33 rule_set => $rule_set,
34 )->assign_vars(map +($_ => {}), @$vars);
35 return DX::ResultStream->new(
37 ($self->observation_policy
38 ? (observation_policy => $self->observation_policy)
44 my ($self, $action) = @_;
45 my @invalidate = $action->run;
46 while (my ($type, $value) = splice @invalidate, 0, 2) {
47 $self->facts->{$type}->remove_value($value);