sub query {
my ($self, @terms) = @_;
+ $self->_solve({ allow_actions => 0 }, @terms);
+}
+
+sub solve {
+ my ($self, @terms) = @_;
+ $self->_solve({ allow_actions => 1 }, @terms);
+}
+
+sub ensure {
+ my ($self, @terms) = @_;
+ my $rs = $self->_solve({ allow_actions => 1 }, @terms);
+ my $r = $rs->next;
+ while ($r and $r->actions and my @ind = $r->independent_actions) {
+ $self->run_action($_) for @ind;
+ $rs = $self->_solve({ allow_actions => 1 }, @terms);
+ $r = $rs->next;
+ }
+ return $r;
+}
+
+sub _solve {
+ my ($self, $attrs, @terms) = @_;
my $rule_set = $self->rule_set;
my $head = $rule_set->expand_and_link(undef, @terms, [ 'materialize' ]);
my $state = DX::State->new(
last_choice => [],
facts => $self->facts,
rule_set => $rule_set,
+ %$attrs
);
return DX::ResultStream->new(
for_state => $state,
sub run_action {
my ($self, $action) = @_;
+ warn +(split('::', ref($action)))[-1]."\n";
my @invalidate = $action->run;
while (my ($type, $value) = splice @invalidate, 0, 2) {
$self->facts->{$type}->remove_value($value);