package DX::QueryState;
-use Types::Standard qw(HashRef);
use DX::Scope;
use DX::Hypothesis;
-use DX::SearchState;
+use DX::SearchProcess;
use DX::ResolvedPropositionSet;
use DX::Value::Unset;
use DX::ActionBuilder::UnsetValue;
is => 'ro', isa => PropositionSequence, required => 1
);
-has search_state => (
- is => 'lazy', builder => sub {
- $_[0]->new_search_state_for($_[0]->proposition_sequence)
- },
+has search_process => (
+ is => 'lazy', isa => SearchProcess, builder => sub {
+ $_[0]->new_search_process_for($_[0]->proposition_sequence)
+ }, handles => { search_state => 'current_search_state' },
);
-sub new_search_state_for {
+sub new_search_process_for {
my ($self, $prop_seq) = @_;
- my @local_names = map { keys %{$_->introduces_names} }
+ my @local_names = map { keys %{$_->introduced_names} }
@{$prop_seq->members};
my $scope = DX::Scope->new(
predicates => $self->predicates,
globals => $self->globals,
- locals => [
- dict(
- map +($_ => DX::Value::Unset->new(
- identity_path => [ 0, $_ ],
- action_builder => DX::ActionBuilder::UnsetValue->new(
- target_path => [ 0, $_ ],
- )
- )
- ), @local_names
- )
- ]
+ locals => [ dict() ],
+ lex_map => { }
);
my $hyp = DX::Hypothesis->new(
scope => $scope,
resolved_propositions => DX::ResolvedPropositionSet->new_empty,
- outstanding_propositions => $prop_seq->members,
actions => [],
+ action_applications => [],
action_policy => DX::ActionPolicy::Allow->new,
);
- return DX::SearchState->new(
- current_hypothesis => $hyp,
- alternatives => [],
- );
+ return DX::SearchProcess->new_for($hyp, $prop_seq);
}
sub with_additional_proposition {
my ($self, $prop) = @_;
my $prop_seq = $self->proposition_sequence
- ->but_append_proposition($prop);
+ ->with_additional_proposition($prop);
+ my $sol_ss = $self->new_search_process_for($prop_seq)
+ ->find_solution;
+ die "No solution\n" unless $sol_ss;
$self->but(
proposition_sequence => $prop_seq,
- search_state => $self->new_search_state_for($prop_seq)
+ search_process => $sol_ss,
);
}
+sub with_forced_backtrack {
+ my ($self) = @_;
+ my $next_ss = $self->search_process->find_next_solution;
+ die "No next solution\n" unless $next_ss;
+ $self->but(search_process => $next_ss);
+}
+
1;