% call_with_inference_limit
-:- non_counted_backtracking end_block/4.
-
-end_block(_, Bb, NBb, _L) :-
- '$clean_up_block'(NBb),
- '$reset_block'(Bb).
-end_block(B, _Bb, NBb, L) :-
- '$install_inference_counter'(B, L, _),
- '$reset_block'(NBb),
- '$fail'.
-
-:- non_counted_backtracking handle_ile/3.
-
-handle_ile(B, inference_limit_exceeded(B), R) :-
- !,
- R = inference_limit_exceeded,
- '$pop_ball_stack'.
-handle_ile(B, _, _) :-
- '$remove_call_policy_check'(B),
- '$pop_from_ball_stack',
- '$unwind_stack'.
-
:- meta_predicate(call_with_inference_limit(0, ?, ?)).
:- non_counted_backtracking call_with_inference_limit/3.
call_with_inference_limit(G, L, R, Bb, B),
'$remove_call_policy_check'(B).
-install_inference_counter(B, L, Count0) :-
- '$install_inference_counter'(B, L, Count0).
:- meta_predicate(call_with_inference_limit(0,?,?,?,?)).
call_with_inference_limit(G, L, R, Bb, B) :-
'$install_new_block'(NBb),
- '$install_inference_counter'(B, L, Count0),
+ '$install_inference_counter'(NBb, L, Count0),
'$call_with_inference_counting'(call(G)),
'$inference_level'(R, B),
- '$remove_inference_counter'(B, Count1),
+ '$remove_inference_counter'(NBb, Count1),
Diff is L - (Count1 - Count0),
- end_block(B, Bb, NBb, Diff).
+ ( '$clean_up_block'(NBb),
+ '$reset_block'(Bb)
+ ; '$install_inference_counter'(NBb, Diff, _),
+ '$reset_block'(NBb),
+ '$fail'
+ ).
call_with_inference_limit(_, _, R, Bb, B) :-
+ ( '$inference_limit_exceeded' ->
+ R = inference_limit_exceeded
+ ; true
+ ),
+ '$get_current_block'(NBb),
+ '$remove_inference_counter'(NBb, _),
'$reset_block'(Bb),
- '$remove_inference_counter'(B, _),
- ( '$get_ball'(Ball),
+ '$remove_call_policy_check'(B),
+ ( '$get_ball'(_),
'$push_ball_stack',
'$get_cp'(Cp),
- '$set_cp_by_default'(Cp)
- ; '$remove_call_policy_check'(B),
- '$fail'
- ),
- handle_ile(B, Ball, R).
+ '$set_cp_by_default'(Cp),
+ '$pop_from_ball_stack',
+ '$unwind_stack'
+ ; nonvar(R)
+ ).
%% partial_string(String, L, L0)
%
}};
}
+macro_rules! increment_call_count {
+ ($s:expr) => {{
+ if !($s.increment_call_count_fn)(&mut $s) {
+ $s.backtrack();
+ continue;
+ }
+ }};
+}
+
macro_rules! try_or_throw_gen {
($s:expr, $e:expr) => {{
match $e {
self.trust_me();
}
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(
- &mut self.machine_st
- )
- );
+ increment_call_count!(self.machine_st);
}
}
}
self.trust_me();
}
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(
- &mut self.machine_st
- )
- );
+ increment_call_count!(self.machine_st);
}
}
}
}
&Instruction::RetryMeElse(offset) => {
self.retry_me_else(offset);
-
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
+ increment_call_count!(self.machine_st);
}
&Instruction::TrustMe(_) => {
self.trust_me();
-
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
+ increment_call_count!(self.machine_st);
}
&Instruction::NeckCut => {
self.machine_st.neck_cut();
if self.machine_st.is_cyclic_term(addr) {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.is_cyclic_term(addr) {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if let Some(Ordering::Greater) = compare_term_test!(self.machine_st, a1, a2)
{
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
} else {
self.machine_st.backtrack();
if let Some(Ordering::Greater) = compare_term_test!(self.machine_st, a1, a2)
{
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
} else {
self.machine_st.backtrack();
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Less) = compare_term_test!(self.machine_st, a1, a2) {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
} else {
self.machine_st.backtrack();
let a2 = self.machine_st.registers[2];
if let Some(Ordering::Less) = compare_term_test!(self.machine_st, a1, a2) {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
} else {
self.machine_st.backtrack();
match compare_term_test!(self.machine_st, a1, a2) {
Some(Ordering::Greater | Ordering::Equal) => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
_ => {
match compare_term_test!(self.machine_st, a1, a2) {
Some(Ordering::Greater | Ordering::Equal) => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
_ => {
match compare_term_test!(self.machine_st, a1, a2) {
Some(Ordering::Less | Ordering::Equal) => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
_ => {
match compare_term_test!(self.machine_st, a1, a2) {
Some(Ordering::Less | Ordering::Equal) => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
_ => {
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.eq_test(a1, a2) {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.eq_test(a1, a2) {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.ground_test() {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.ground_test() {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if let Some(Ordering::Equal) = compare_term_test!(self.machine_st, a1, a2) {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if let Some(Ordering::Equal) = compare_term_test!(self.machine_st, a1, a2) {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
+ increment_call_count!(self.machine_st);
}
}
&Instruction::ExecuteN(arity) => {
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
+ increment_call_count!(self.machine_st);
}
}
&Instruction::DefaultCallN(arity) => {
match n1.cmp(&n2) {
Ordering::Less | Ordering::Equal => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
_ => {
match n1.cmp(&n2) {
Ordering::Less | Ordering::Equal => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
_ => {
match n1.cmp(&n2) {
Ordering::Equal => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
_ => {
match n1.cmp(&n2) {
Ordering::Equal => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
_ => {
self.machine_st.backtrack();
}
_ => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
}
self.machine_st.backtrack();
}
_ => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
}
match n1.cmp(&n2) {
Ordering::Greater | Ordering::Equal => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
_ => {
match n1.cmp(&n2) {
Ordering::Greater | Ordering::Equal => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
_ => {
match n1.cmp(&n2) {
Ordering::Greater => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
_ => {
match n1.cmp(&n2) {
Ordering::Greater => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
_ => {
match n1.cmp(&n2) {
Ordering::Less => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p += 1;
}
_ => {
match n1.cmp(&n2) {
Ordering::Less => {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
-
+ increment_call_count!(self.machine_st);
self.machine_st.p = self.machine_st.cp;
}
_ => {
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
+ increment_call_count!(self.machine_st);
}
}
&Instruction::ExecuteNamed(arity, name, ref idx) => {
if self.machine_st.fail {
self.machine_st.backtrack();
} else {
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(&mut self.machine_st)
- );
+ increment_call_count!(self.machine_st);
}
}
&Instruction::DefaultCallNamed(arity, name, ref idx) => {
}
&IndexedChoiceInstruction::Retry(l) => {
self.retry(l);
-
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(
- &mut self.machine_st
- )
- );
+ increment_call_count!(self.machine_st);
}
&IndexedChoiceInstruction::DefaultRetry(l) => {
self.retry(l);
}
&IndexedChoiceInstruction::Trust(l) => {
self.trust(l);
-
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(
- &mut self.machine_st
- )
- );
+ increment_call_count!(self.machine_st);
}
&IndexedChoiceInstruction::DefaultTrust(l) => {
self.trust(l);
// this is true iff ii + 1 < len.
Some(_) => {
self.retry(offset);
-
- try_or_throw!(
- self.machine_st,
- (self
- .machine_st
- .increment_call_count_fn)(
- &mut self.machine_st
- )
- );
+ increment_call_count!(self.machine_st);
}
_ => {
self.trust(offset);
-
- try_or_throw!(
- self.machine_st,
- (self
- .machine_st
- .increment_call_count_fn)(
- &mut self.machine_st
- )
- );
+ increment_call_count!(self.machine_st);
}
}
} else {
self.trust(offset);
-
- try_or_throw!(
- self.machine_st,
- (self.machine_st.increment_call_count_fn)(
- &mut self.machine_st
- )
- );
+ increment_call_count!(self.machine_st);
}
}
}
self.get_db_refs();
step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
}
+ &Instruction::CallInferenceLimitExceeded => {
+ self.inference_limit_exceeded();
+ step_or_fail!(self, self.machine_st.p += 1);
+ }
+ &Instruction::ExecuteInferenceLimitExceeded => {
+ self.inference_limit_exceeded();
+ step_or_fail!(self, self.machine_st.p = self.machine_st.cp);
+ }
}
}