add fixes, further test cases.

This commit is contained in:
Mark Thom
2018-02-25 22:38:28 -07:00
parent 82f0f7c7fe
commit c133931134
6 changed files with 29 additions and 8 deletions

View File

@@ -951,8 +951,9 @@ pub enum ArithmeticInstruction {
pub enum BuiltInInstruction { pub enum BuiltInInstruction {
CleanUpBlock, CleanUpBlock,
CompareNumber(CompareNumberQT, ArithmeticTerm, ArithmeticTerm), CompareNumber(CompareNumberQT, ArithmeticTerm, ArithmeticTerm),
DefaultTrustMe, DefaultTrustMe,
DefaultSetCutPoint(RegType),
DynamicCompareNumber(CompareNumberQT), DynamicCompareNumber(CompareNumberQT),
EraseBall, EraseBall,
Fail, Fail,

View File

@@ -119,7 +119,7 @@ fn get_builtins() -> Code {
unify_variable!(temp_v!(1)), unify_variable!(temp_v!(1)),
unify_variable!(temp_v!(2))], unify_variable!(temp_v!(2))],
set_cp!(temp_v!(3)), set_cp!(temp_v!(3)),
goto_execute!(83, 3), goto_execute!(77, 3),
retry_me_else!(4), retry_me_else!(4),
fact![get_constant!(atom!("!"), temp_v!(1)), fact![get_constant!(atom!("!"), temp_v!(1)),
get_constant!(atom!("!"), temp_v!(2))], get_constant!(atom!("!"), temp_v!(2))],
@@ -142,7 +142,7 @@ fn get_builtins() -> Code {
put_unsafe_value!(1, 2), put_unsafe_value!(1, 2),
put_value!(perm_v!(3), 3)], put_value!(perm_v!(3), 3)],
deallocate!(), deallocate!(),
goto_execute!(83, 3), goto_execute!(77, 3),
retry_me_else!(10), retry_me_else!(10),
allocate!(2), allocate!(2),
get_level!(perm_v!(2)), get_level!(perm_v!(2)),
@@ -475,7 +475,7 @@ fn get_builtins() -> Code {
query![put_var!(perm_v!(1), 1)], query![put_var!(perm_v!(1), 1)],
get_ball!(), get_ball!(),
get_level!(perm_v!(2)), get_level!(perm_v!(2)),
set_cp!(perm_v!(2)), default_set_cp!(perm_v!(2)),
goto_call!(342, 0), // goto run_cleaners_with_handling/0, 342. goto_call!(342, 0), // goto run_cleaners_with_handling/0, 342.
query![put_unsafe_value!(1, 1)], query![put_unsafe_value!(1, 1)],
deallocate!(), deallocate!(),
@@ -494,7 +494,7 @@ fn get_builtins() -> Code {
put_var!(temp_v!(4), 2), put_var!(temp_v!(4), 2),
put_constant!(Level::Shallow, atom!("true"), temp_v!(3))], put_constant!(Level::Shallow, atom!("true"), temp_v!(3))],
goto_call!(5, 3), // goto catch/3, 5. goto_call!(5, 3), // goto catch/3, 5.
set_cp!(perm_v!(1)), default_set_cp!(perm_v!(1)),
deallocate!(), deallocate!(),
goto_execute!(342, 0), // goto run_cleaners_with_handling/0, 342. goto_execute!(342, 0), // goto run_cleaners_with_handling/0, 342.
trust_me!(), trust_me!(),
@@ -506,7 +506,7 @@ fn get_builtins() -> Code {
get_cleaner_call!(), get_cleaner_call!(),
query![put_value!(perm_v!(2), 1)], query![put_value!(perm_v!(2), 1)],
call_n!(1), call_n!(1),
set_cp!(perm_v!(1)), default_set_cp!(perm_v!(1)),
deallocate!(), deallocate!(),
goto_execute!(354, 0), // goto run_cleaners_without_handling/0, 354. goto_execute!(354, 0), // goto run_cleaners_without_handling/0, 354.
trust_me!(), trust_me!(),

View File

@@ -205,6 +205,8 @@ impl fmt::Display for BuiltInInstruction {
match self { match self {
&BuiltInInstruction::CleanUpBlock => &BuiltInInstruction::CleanUpBlock =>
write!(f, "clean_up_block"), write!(f, "clean_up_block"),
&BuiltInInstruction::DefaultSetCutPoint(r) =>
write!(f, "default_set_cp {}", r),
&BuiltInInstruction::DefaultTrustMe => &BuiltInInstruction::DefaultTrustMe =>
write!(f, "default_trust_me"), write!(f, "default_trust_me"),
&BuiltInInstruction::InstallInferenceCounter(r1, r2, r3) => &BuiltInInstruction::InstallInferenceCounter(r1, r2, r3) =>

View File

@@ -1218,6 +1218,10 @@ impl MachineState {
self.compare_numbers(cmp, n1, n2); self.compare_numbers(cmp, n1, n2);
}, },
&BuiltInInstruction::DefaultSetCutPoint(r) => {
let mut default_cut_policy = DefaultCutPolicy {};
default_cut_policy.cut(self, r);
},
&BuiltInInstruction::DefaultTrustMe => { &BuiltInInstruction::DefaultTrustMe => {
let mut call_policy = DefaultCallPolicy {}; let mut call_policy = DefaultCallPolicy {};
try_or_fail!(self, call_policy.trust_me(self)); try_or_fail!(self, call_policy.trust_me(self));
@@ -1472,7 +1476,9 @@ impl MachineState {
self.p += 1; self.p += 1;
}, },
&BuiltInInstruction::SetCutPoint(r) => { &BuiltInInstruction::SetCutPoint(r) =>
cut_policy.cut(self, r),
/*{
let addr = self.store(self.deref(self[r].clone())); let addr = self.store(self.deref(self[r].clone()));
match addr { match addr {
@@ -1487,7 +1493,7 @@ impl MachineState {
}, },
_ => self.fail = true _ => self.fail = true
}; };
}, },*/
&BuiltInInstruction::CleanUpBlock => { &BuiltInInstruction::CleanUpBlock => {
let nb = self.store(self.deref(self[temp_v!(1)].clone())); let nb = self.store(self.deref(self[temp_v!(1)].clone()));

View File

@@ -657,6 +657,12 @@ macro_rules! inference_level {
) )
} }
macro_rules! default_set_cp {
($r:expr) => (
Line::BuiltIn(BuiltInInstruction::DefaultSetCutPoint($r))
)
}
macro_rules! default_trust_me { macro_rules! default_trust_me {
() => ( () => (
Line::BuiltIn(BuiltInInstruction::DefaultTrustMe) Line::BuiltIn(BuiltInInstruction::DefaultTrustMe)

View File

@@ -1387,6 +1387,12 @@ fn test_queries_on_builtins()
assert_prolog_success!(&mut wam, "?- [X,Y,Z] =@= [V,W,Z]."); assert_prolog_success!(&mut wam, "?- [X,Y,Z] =@= [V,W,Z].");
assert_prolog_success!(&mut wam, "?- [X,Y,X] =@= [V,W,V]."); assert_prolog_success!(&mut wam, "?- [X,Y,X] =@= [V,W,V].");
assert_prolog_success!(&mut wam, "?- g(B) = B, g(A) = A, A =@= B."); assert_prolog_success!(&mut wam, "?- g(B) = B, g(A) = A, A =@= B.");
assert_prolog_success!(&mut wam, "?- call(((G = 2 ; fail), B=3, !)).",
[["G = 2", "B = 3"]]);
assert_prolog_success!(&mut wam, "?- call_with_inference_limit((setup_call_cleanup(S=1,(G=2;fail),display(S+G>B)), B=3, !), 100, R).",
[["G = 2", "B = 3", "R = !", "S = 1"]]);
} }
#[test] #[test]