X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDX%2FSearchState.pm;h=0a306c9df0024a02173797172abca4f262dfdeae;hb=a97779a16ec8afef233e00d91d541d4972fa0fd0;hp=005aa3cb99cf87c8ea84e832b2ede4abea0f47d0;hpb=f696251fa8f0d2648e89a3ab46c676593a9a1798;p=scpubgit%2FDX.git diff --git a/lib/DX/SearchState.pm b/lib/DX/SearchState.pm index 005aa3c..0a306c9 100644 --- a/lib/DX/SearchState.pm +++ b/lib/DX/SearchState.pm @@ -1,22 +1,30 @@ package DX::SearchState; use Types::Standard qw(Maybe); -use DX::Step::InvokeNextPredicate; +use DX::Step::Backtrack; +use DX::Step::ConsiderProposition; +use DX::Step::MarkAsSolution; use DX::Class; has current_hypothesis => (is => 'ro', isa => Hypothesis, required => 1); -has next_step => (is => 'ro', isa => Maybe[Step]); +has next_step => (is => 'ro', isa => Maybe[Step], required => 1); has propositions => (is => 'ro', isa => PropositionSequence, required => 1); -has alternatives => (is => 'ro', isa => AlternativeList, required => 1); +has adjustments_made => (is => 'ro', isa => AdjustmentList, required => 1); + +has is_solution_state => (is => 'ro', required => 1); + +has on_exhaustion_step => (is => 'ro', isa => Maybe[Step], required => 1); + +has on_solution_step => (is => 'ro', isa => Maybe[Step], required => 1); sub next_proposition { - my ($self, $hyp) = @_; - $hyp ||= $self->current_hypothesis; + my ($self) = @_; + my $hyp = $self->current_hypothesis; $self->propositions->members->[ - $hyp->resolved_propositions->resolved_count + $hyp->resolved_propositions->resolved_count + 1 ]; } @@ -24,53 +32,34 @@ sub new_for { my ($class, $hyp, $props) = @_; $class->new( current_hypothesis => $hyp, - alternatives => [], - next_step => DX::Step::InvokeNextPredicate->new( - proposition => $props->members->[0], - ), + adjustments_made => [], propositions => $props, + (@{$props->members} + ? ( + next_step => DX::Step::ConsiderProposition->new( + proposition => $props->members->[0], + ), + is_solution_state => 0, + ) + : ( next_step => undef, is_solution_state => 1 ) + ), + on_exhaustion_step => undef, + on_solution_step => DX::Step::MarkAsSolution->new, ); } sub with_one_step { my ($self) = @_; - my $hyp = $self->current_hypothesis; return undef unless my $step = $self->next_step; - my ($new_ss, $alt_step) = $step->apply_to($self); - if ($new_ss) { - return $new_ss->but( - alternatives => [ - ($alt_step - ? [ $hyp, $alt_step ] - : ()), - @{$new_ss->alternatives} - ], - ); - } - if ($alt_step) { - return $self->but(next_step => $alt_step); - } - my ($first_alt, @rest_alt) = @{$self->alternatives}; - return undef unless $first_alt; - trace 'search.backtrack.rewind_to' => $first_alt->[1]; - return $self->but( - current_hypothesis => $first_alt->[0], - alternatives => \@rest_alt, - next_step => $first_alt->[1], - ); + trace step => $step; + return $step->apply_to($self); } sub force_backtrack { my ($self) = @_; - my ($first_alt, @rest_alt) = @{$self->alternatives}; - return undef unless $first_alt; - trace 'search.backtrack.forced' => $first_alt->[0]; - return ref($self)->new( - current_hypothesis => $first_alt->[0], - next_step => $first_alt->[1], - alternatives => \@rest_alt, - propositions => $self->propositions, - ); + return $self->but( + next_step => DX::Step::Backtrack->new, + )->with_one_step; } 1;