Commit | Line | Data |
55131db4 |
1 | package DX::Step::Backtrack; |
2 | |
4db57c04 |
3 | use DX::DependencyMap; |
3cc9323e |
4 | use DX::Utils qw(format_deps compact_deps); |
55131db4 |
5 | use DX::Class; |
6 | |
7 | with 'DX::Role::Step'; |
8 | |
4db57c04 |
9 | has resolution_space => (is => 'ro', isa => ResolutionSpace, required => 1); |
d6b0c811 |
10 | |
55131db4 |
11 | sub apply_to { |
12 | my ($self, $ss) = @_; |
4db57c04 |
13 | my $rspace = $self->resolution_space; |
14 | trace backtrack => [ statement => [ |
15 | [ symbol => 'backtrack' ], |
3cc9323e |
16 | [ 'enter_block' ] |
17 | ] ]; |
72304627 |
18 | trace backtrack => [ word_and_body => [ |
19 | 'failure_dependencies', |
3cc9323e |
20 | format_deps($rspace->geometry_depends_on) |
4db57c04 |
21 | ] ]; |
22 | my $dmap = DX::DependencyMap->new_empty |
23 | ->with_dependencies_for( |
24 | backtrack => $rspace->geometry_depends_on |
25 | ); |
3cc9323e |
26 | DECISION: foreach my $adj (@{$ss->decisions_taken}) { |
1c02730b |
27 | my ($rspace_was, $ss_was) = @$adj; |
3cc9323e |
28 | trace backtrack => [ statement => [ |
29 | [ symbol => 'decision' ], |
30 | [ pairs => [ |
31 | [ for => $rspace_was->proposition, ] |
32 | #aperture => |
33 | ] ] |
c99dbb05 |
34 | ] ]; |
3cc9323e |
35 | foreach my $event (@{$rspace_was->aperture}) { |
36 | if ($dmap->dependents_of($event)) { |
37 | my $remain = $rspace_was->remaining_resolution_space; |
38 | if (@{$remain->members}) { |
39 | trace backtrack => [ statement => [ |
40 | [ symbol => 'found_alternative' ] |
41 | ] ]; |
42 | trace backtrack => [ 'leave_block' ]; |
43 | return $ss_was->but( |
44 | next_step => $remain->with_geometry_dependencies( |
45 | $dmap->dependencies_for('backtrack') |
46 | )->next_step |
47 | ); |
48 | } |
49 | $dmap = $dmap->with_dependencies_for( |
50 | backtrack => $rspace_was->geometry_depends_on |
51 | ); |
72304627 |
52 | trace backtrack => [ word_and_body => [ |
53 | 'failure_dependencies', |
3cc9323e |
54 | format_deps(compact_deps($dmap->dependencies_for('backtrack'))) |
55 | ] ]; |
56 | next DECISION; |
57 | } |
58 | } |
59 | trace backtrack => [ statement => [ [ symbol => 'non_relevant' ] ] ]; |
76329453 |
60 | } |
3cc9323e |
61 | trace backtrack => [ statement => [ [ symbol => 'exhaustion' ] ] ]; |
62 | trace backtrack => [ 'leave_block' ]; |
63 | return $ss->but( |
64 | next_step |
65 | => $ss->on_exhaustion_step->but( |
66 | exhaustion_depends_on => $dmap->dependencies_for('backtrack') |
67 | ) |
68 | ); |
55131db4 |
69 | } |
70 | |
71 | 1; |