1 package DX::Step::ResolveProposition;
3 use DX::Step::EnterRecheck;
4 use DX::Step::CompleteResolution;
5 use DX::Step::Backtrack;
7 use DX::Utils qw(expand_deps);
11 with 'DX::Role::Step';
13 has resolution_space => (is => 'ro', isa => ResolutionSpace);
15 sub resolves { shift->resolution_space->proposition }
17 sub current_resolution { shift->resolution_space->next_resolution }
19 sub actions { shift->current_resolution->actions }
21 sub depends_on { shift->current_resolution->veracity_depends_on }
24 my ($self, @actions) = @_;
25 $self->but(actions => [ @actions, @{$self->actions} ]);
28 sub but_with_dependencies_on {
29 my ($self, @deps) = @_;
30 $self->but(depends_on => [ @{$self->depends_on}, @deps ]);
34 my ($self, $old_ss) = @_;
35 trace resolve => [ statement => [
36 [ symbol => 'resolve' ],
39 [ symbol => 'proposition' ],
40 @{$self->resolves->for_deparse->[1]},
44 [ symbol => 'actions' ],
45 [ block => $self->actions ],
49 [ symbol => 'depends_on' ],
52 [ symbol => (split '::', ${$_->[0]})[-1] ],
53 [ value_path => [ @{$_}[1..$#$_] ] ]
54 ] ], @{$self->depends_on}
59 my $rspace = $self->resolution_space;
60 my $ss = $old_ss->but(
61 next_step => DX::Step::CompleteResolution->new(
62 original_search_state => $old_ss,
63 resolution_space => $rspace,
66 my $old_hyp = $old_ss->current_hypothesis;
67 (my $hyp, my @recheck) = $old_hyp->with_resolution(
68 $self->resolves, $self->depends_on, $self->actions
70 return $ss->but(next_step => DX::Step::Backtrack->new) unless $hyp;
71 return $ss->but(current_hypothesis => $hyp) unless @recheck;
73 current_hypothesis => $hyp,
74 next_step => DX::Step::EnterRecheck->new(
75 proposition_list => \@recheck,
76 on_completion_step => $ss->next_step,
77 on_failure_step => $rspace->remaining_resolution_space->next_step,