X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDX%2FSolver.pm;h=6626840155489b3d9cd824c94b67c9106dc5392e;hb=8c3eab7b6e8673436ef6891743a503cb948a7795;hp=05523ecd3b48a4bbd110b3c4a6a6710b32f27c1b;hpb=b40e416a04d2a7914f77905ac13594f71ac881c9;p=scpubgit%2FDKit.git diff --git a/lib/DX/Solver.pm b/lib/DX/Solver.pm index 05523ec..6626840 100644 --- a/lib/DX/Solver.pm +++ b/lib/DX/Solver.pm @@ -6,17 +6,23 @@ use DX::ResultStream; use List::Util qw(reduce); use Moo; -has rule_set => (is => 'lazy', handles => [ 'add_rule' ], builder => sub { - DX::RuleSet->new -}); +has rule_set => ( + is => 'lazy', + handles => [ qw(add_predicate add_rule) ], + builder => sub { + DX::RuleSet->new + }, +); -has facts => (is => 'ro', required => 1); +has facts => (is => 'ro', default => sub { {} }); + +has observation_policy => (is => 'ro'); sub query { my ($self, $vars, @terms) = @_; my $rule_set = $self->rule_set; - my $head = reduce { $b->but(next => $a) } - reverse map $rule_set->expand(@$_), @terms; + push @terms, map +[ materialize => $_ ], @$vars; + my $head = $rule_set->expand_and_link(undef, @terms); my $state = DX::State->new( next_op => $head, return_stack => [], @@ -27,8 +33,19 @@ sub query { rule_set => $rule_set, )->assign_vars(map +($_ => {}), @$vars); return DX::ResultStream->new( - for_state => $state + for_state => $state, + ($self->observation_policy + ? (observation_policy => $self->observation_policy) + : ()), ); } +sub run_action { + my ($self, $action) = @_; + my @invalidate = $action->run; + while (my ($type, $value) = splice @invalidate, 0, 2) { + $self->facts->{$type}->remove_value($value); + } +} + 1;