deallocate!(),
remove_call_policy_check!(),
proceed!(),
- try_me_else!(18), // call_with_inference_limit/5, 404.
+ try_me_else!(19), // call_with_inference_limit/5, 404.
allocate!(9),
fact![get_var_in_fact!(perm_v!(9), 1),
- get_var_in_fact!(perm_v!(6), 2),
- get_var_in_fact!(perm_v!(5), 3),
+ get_var_in_fact!(perm_v!(5), 2),
+ get_var_in_fact!(perm_v!(8), 3),
get_var_in_fact!(perm_v!(3), 4),
get_var_in_fact!(perm_v!(4), 5)],
query![put_var!(perm_v!(1), 1)],
install_new_block!(),
- install_inference_counter!(perm_v!(4), perm_v!(6), perm_v!(8)),
+ query![put_var!(perm_v!(7), 3)],
+ install_inference_counter!(perm_v!(4), perm_v!(5), perm_v!(7)),
query![put_value!(perm_v!(9), 1)],
call_n!(1),
- remove_inference_counter!(perm_v!(4), perm_v!(7)),
- sub!(ArithmeticTerm::Reg(perm_v!(7)),
- ArithmeticTerm::Reg(perm_v!(8)),
- 1),
+ inference_level!(perm_v!(8), perm_v!(4)),
+ query![put_var!(perm_v!(6), 2)],
+ remove_inference_counter!(perm_v!(4), perm_v!(6)),
sub!(ArithmeticTerm::Reg(perm_v!(6)),
+ ArithmeticTerm::Reg(perm_v!(7)),
+ 1),
+ sub!(ArithmeticTerm::Reg(perm_v!(5)),
ArithmeticTerm::Interm(1),
1),
- query![put_value!(perm_v!(2), 1)],
+ query![put_var!(perm_v!(2), 1)],
is_call!(temp_v!(1), ArithmeticTerm::Interm(1)),
- query![put_value!(perm_v!(5), 1),
- put_value!(perm_v!(4), 2)],
- inference_level!(),
query![put_value!(perm_v!(4), 1),
put_value!(perm_v!(3), 2),
put_value!(perm_v!(1), 3),
- put_value!(perm_v!(2), 4)],
+ put_value!(perm_v!(2), 4)],
deallocate!(),
- goto_execute!(442, 4), // goto end_block/4, 442.
- default_trust_me!(), // 422.
+ goto_execute!(452, 4), // goto end_block/4, 452
+ default_trust_me!(), // 423
allocate!(3),
fact![get_var_in_fact!(perm_v!(1), 3),
get_var_in_fact!(perm_v!(3), 5)],
reset_block!(),
query![put_var!(temp_v!(3), 2)],
remove_inference_counter!(perm_v!(3), temp_v!(2)),
- query![put_var!(perm_v!(2), 1)],
- get_ball!(),
+ query![put_value!(perm_v!(3), 1),
+ put_var!(perm_v!(2), 2)],
+ jmp_call!(2, 5),
erase_ball!(),
query![put_value!(perm_v!(3), 1),
put_unsafe_value!(2, 2),
put_value!(perm_v!(1), 3)],
deallocate!(),
- goto_execute!(435, 3), // goto handle_ile/3, 435.
- try_me_else!(4), // handle_ile/3, 435.
+ goto_execute!(444, 3), // goto handle_ile/3, 442.
+ try_me_else!(5), // the inner clause.
+ query![put_value!(temp_v!(2), 1)],
+ get_ball!(),
+ neck_cut!(),
+ proceed!(),
+ default_trust_me!(),
+ remove_call_policy_check!(),
+ fail!(),
+ try_me_else!(4), // handle_ile/3, 444.
fact![get_structure!(atom_tbl, "inference_limit_exceeded", 1, temp_v!(2), None),
unify_value!(temp_v!(1)),
get_constant!(atom!("inference_limit_exceeded", atom_tbl), temp_v!(3))],
neck_cut!(),
proceed!(),
default_trust_me!(),
+ remove_call_policy_check!(),
query![put_value!(temp_v!(2), 1)],
goto_execute!(59, 1), // goto throw/1, 59.
- try_me_else!(6), // end_block/4, 442.
+ try_me_else!(6), // end_block/4, 452.
query![put_value!(temp_v!(3), 1)],
clean_up_block!(),
query![put_value!(temp_v!(2), 1)],
reset_block!(),
proceed!(),
default_trust_me!(),
- query![put_value!(temp_v!(4), 2),
- put_var!(temp_v!(4), 4)],
- install_inference_counter!(temp_v!(1), temp_v!(2), temp_v!(4)),
- query![put_value!(temp_v!(3), 1)],
+ query![get_var_in_query!(temp_v!(5), 3),
+ put_value!(temp_v!(4), 2),
+ put_var!(temp_v!(6), 3)],
+ install_inference_counter!(temp_v!(1), temp_v!(4), temp_v!(6)),
+ query![put_value!(temp_v!(5), 1)],
reset_block!(),
fail!(),
- compare_execute!() // compare/3, 454.
+ compare_execute!() // compare/3, 464.
]
}
code_dir.insert((tabled_rc!("@<", atom_tbl), 2), (PredicateKeyType::BuiltIn, 390));
code_dir.insert((tabled_rc!("=@=", atom_tbl), 2), (PredicateKeyType::BuiltIn, 391));
code_dir.insert((tabled_rc!("\\=@=", atom_tbl), 2), (PredicateKeyType::BuiltIn, 392));
- code_dir.insert((tabled_rc!("compare", atom_tbl), 3), (PredicateKeyType::BuiltIn, 454));
+ code_dir.insert((tabled_rc!("compare", atom_tbl), 3), (PredicateKeyType::BuiltIn, 464));
(builtin_code, code_dir, op_dir)
}
let tr = self.tr;
let val = self.trail[tr - 1];
self.trail[i] = val;
+ self.tr -= 1; // NEW.
},
Ref::StackCell(fr, _) => {
let b = self.b - 1;
let tr = self.tr;
let val = self.trail[tr - 1];
self.trail[i] = val;
+ self.tr -= 1; // NEW.
}
}
};
self.p += 1;
},
- &BuiltInInstruction::InferenceLevel => { // X1 = R, X2 = B.
- let a1 = self[temp_v!(1)].clone();
- let a2 = self.store(self.deref(self[temp_v!(2)].clone()));
+ &BuiltInInstruction::InferenceLevel(r1, r2) => { // X1 = R, X2 = B.
+ let a1 = self[r1].clone();
+ let a2 = self.store(self.deref(self[r2].clone()));
match a2 {
Addr::Con(Constant::Usize(bp)) =>
match call_policy.downcast_mut::<CallWithInferenceLimitCallPolicy>().ok() {
Some(call_policy) => {
let count = call_policy.add_limit(n, bp);
- self[r3] = Addr::Con(Constant::Number(Number::Integer(count)));
+ self[r3] = Addr::Con(Constant::Number(Number::Integer(count)));
},
None => panic!("install_inference_counter: should have installed \\
CallWithInferenceLimitCallPolicy.")
None
}
} else {
- panic!("remove_inference_counter: expected Usize in A1.");
+ panic!("remove_call_policy_check: expected Usize in A1.");
}
},
- None => panic!("remove_inference_counters: requires \\
+ None => panic!("remove_call_policy_check: requires \\
CallWithInferenceLimitCallPolicy.")
};
self.p += 1;
},
- &BuiltInInstruction::RemoveInferenceCounter(r1, r2) => { // A1 = B, A2 = Count.
+ &BuiltInInstruction::RemoveInferenceCounter(r1, r2) => { // A1 = B
match call_policy.downcast_mut::<CallWithInferenceLimitCallPolicy>().ok() {
Some(call_policy) => {
let a1 = self.store(self.deref(self[r1].clone()));
if let Addr::Con(Constant::Usize(bp)) = a1 {
let count = call_policy.remove_limit(bp);
- self[r2] = Addr::Con(Constant::Number(Number::Integer(count)));
-
+ self[r2] = Addr::Con(Constant::Number(Number::Integer(count)));
} else {
panic!("remove_inference_counter: expected Usize in A1.");
}
Ordering::Equal => atom!("=", self.atom_tbl),
Ordering::Less => atom!("<", self.atom_tbl)
});
-
+
self.unify(a1, c);
-
+
self.p += 1;
},
&ControlInstruction::CompareExecute => {
Ordering::Equal => atom!("=", self.atom_tbl),
Ordering::Less => atom!("<", self.atom_tbl)
});
-
+
self.unify(a1, c);
-
+
self.p = self.cp;
},
&ControlInstruction::CompareTermCall(qt) => {
assert_prolog_success!(&mut wam, "?- call_with_inference_limit(throw(error), 0, R).",
[["R = inference_limit_exceeded"]]);
- assert_prolog_success!(&mut wam, "?- catch(call_with_inference_limit(throw(error), 1, R),
- error,
- true).");
+ assert_prolog_success!(&mut wam, "?- catch(call_with_inference_limit(throw(error), 1, R), error, true).");
assert_prolog_failure!(&mut wam, "?- call_with_inference_limit(g(X), 5, R).");
[["R = true", "X = 1"],
["R = true", "X = 2"],
["R = inference_limit_exceeded", "X = _1"]]);
+ assert_prolog_success!(&mut wam, "?- call_with_inference_limit(g(X), 3, R1),
+ call_with_inference_limit(g(X), 5, R2).",
+ [["X = 1", "R1 = true", "R2 = !"],
+ ["X = 2", "R1 = true", "R2 = !"],
+ ["X = 3", "R1 = true", "R2 = !"],
+ ["X = 4", "R1 = true", "R2 = !"],
+ ["X = 5", "R1 = !", "R2 = !"]]);
submit(&mut wam, "f(X) :- call_with_inference_limit(g(X), 5, _).");