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 => 'rw');
21 has action_callback => (is => 'rw');
24 my ($self, @terms) = @_;
25 $self->_solve({ allow_actions => 0 }, @terms);
29 my ($self, @terms) = @_;
30 $self->_solve({ allow_actions => 1 }, @terms);
34 my ($self, @terms) = @_;
35 my $rs = $self->_solve({ allow_actions => 1 }, @terms);
37 while ($r and $r->actions and my @ind = $r->independent_actions) {
38 $self->run_action($_) for @ind;
39 $rs = $self->_solve({ allow_actions => 1 }, @terms);
46 my ($self, $attrs, @terms) = @_;
47 my $rule_set = $self->rule_set;
48 my $head = $rule_set->expand_and_link(undef, @terms, [ 'materialize' ]);
49 my $state = DX::State->new(
55 facts => $self->facts,
56 rule_set => $rule_set,
59 return DX::ResultStream->new(
61 ($self->observation_policy
62 ? (observation_policy => $self->observation_policy)
68 my ($self, $action) = @_;
69 if (my $cb = $self->action_callback) {
72 my @invalidate = $action->run;
73 while (my ($type, $value) = splice @invalidate, 0, 2) {
74 $self->facts->{$type}->remove_value($value);