1 package DX::Hypothesis;
3 use DX::ActionPolicy::LockScope;
4 use Types::Standard qw(ArrayRef);
5 use DX::Utils qw(deparse);
8 has scope => (is => 'ro', isa => Scope, required => 1);
10 has resolved_propositions => (
11 is => 'ro', isa => ResolvedPropositionSet, required => 1
14 has outstanding_propositions => (
15 is => 'ro', isa => ArrayRef[Proposition], required => 1
19 is => 'ro', isa => ArrayRef[Action], required => 1
22 has action_applications => (
23 is => 'ro', isa => ArrayRef[Action], required => 1
26 has action_policy => (is => 'ro', isa => ActionPolicy, required => 1);
28 sub head_proposition { shift->outstanding_propositions->[0] }
31 my ($self, @actions) = @_;
33 foreach my $act (@actions) {
34 return undef unless $self->action_policy->allows($act);
35 ($hyp, my @events) = $act->dry_run($hyp);
36 return undef unless $hyp;
37 $hyp = $hyp->but_recheck_for(@events);
38 return undef unless $hyp;
44 my ($self, @events) = @_;
45 my ($still_resolved, @recheck) = $self->resolved_propositions
46 ->but_expire_for(@events);
47 return $self unless @recheck;
49 my $ap = DX::ActionPolicy::LockScope->new(
50 lock_to_depth => $self->scope->depth,
51 next_policy => $self->action_policy,
54 # we should probably be doing something about pruning the scope
55 # but that's completely pointless until we have rules
57 my $hyp = ref($self)->new(
58 scope => $self->scope,
59 resolved_propositions => DX::ResolvedPropositionSet->new_empty,
60 outstanding_propositions => \@recheck,
62 action_applications => [],
66 my $ss = DX::SearchState->new_for($hyp);
68 return undef unless my $sol_ss = $ss->find_solution;
70 my $sol_rps = $sol_ss->current_hypothesis->resolved_propositions;
72 my $rps = $still_resolved;
74 $rps = $rps->with_updated_dependencies_for(
75 $_, $sol_rps->dependencies_for($_)
78 return $self->but(resolved_propositions => $rps);
81 sub resolve_head_dependent_on {
82 my ($self, $depends) = @_;
83 my ($first, @rest) = @{$self->outstanding_propositions};
85 resolved_propositions => $self->resolved_propositions
86 ->with_resolution_for(
90 outstanding_propositions => \@rest,