From c13393113483f2faf8cb605739430c38ebdd6429 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 25 Feb 2018 22:38:28 -0700 Subject: [PATCH] add fixes, further test cases. --- src/prolog/ast.rs | 3 ++- src/prolog/builtins.rs | 10 +++++----- src/prolog/io.rs | 2 ++ src/prolog/machine/machine_state_impl.rs | 10 ++++++++-- src/prolog/macros.rs | 6 ++++++ src/tests.rs | 6 ++++++ 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/prolog/ast.rs b/src/prolog/ast.rs index ac52c74b..1b719c2b 100644 --- a/src/prolog/ast.rs +++ b/src/prolog/ast.rs @@ -951,8 +951,9 @@ pub enum ArithmeticInstruction { pub enum BuiltInInstruction { CleanUpBlock, - CompareNumber(CompareNumberQT, ArithmeticTerm, ArithmeticTerm), + CompareNumber(CompareNumberQT, ArithmeticTerm, ArithmeticTerm), DefaultTrustMe, + DefaultSetCutPoint(RegType), DynamicCompareNumber(CompareNumberQT), EraseBall, Fail, diff --git a/src/prolog/builtins.rs b/src/prolog/builtins.rs index 649fc3ae..feff8fa4 100644 --- a/src/prolog/builtins.rs +++ b/src/prolog/builtins.rs @@ -119,7 +119,7 @@ fn get_builtins() -> Code { unify_variable!(temp_v!(1)), unify_variable!(temp_v!(2))], set_cp!(temp_v!(3)), - goto_execute!(83, 3), + goto_execute!(77, 3), retry_me_else!(4), fact![get_constant!(atom!("!"), temp_v!(1)), get_constant!(atom!("!"), temp_v!(2))], @@ -142,7 +142,7 @@ fn get_builtins() -> Code { put_unsafe_value!(1, 2), put_value!(perm_v!(3), 3)], deallocate!(), - goto_execute!(83, 3), + goto_execute!(77, 3), retry_me_else!(10), allocate!(2), get_level!(perm_v!(2)), @@ -475,7 +475,7 @@ fn get_builtins() -> Code { query![put_var!(perm_v!(1), 1)], get_ball!(), 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. query![put_unsafe_value!(1, 1)], deallocate!(), @@ -494,7 +494,7 @@ fn get_builtins() -> Code { put_var!(temp_v!(4), 2), put_constant!(Level::Shallow, atom!("true"), temp_v!(3))], goto_call!(5, 3), // goto catch/3, 5. - set_cp!(perm_v!(1)), + default_set_cp!(perm_v!(1)), deallocate!(), goto_execute!(342, 0), // goto run_cleaners_with_handling/0, 342. trust_me!(), @@ -506,7 +506,7 @@ fn get_builtins() -> Code { get_cleaner_call!(), query![put_value!(perm_v!(2), 1)], call_n!(1), - set_cp!(perm_v!(1)), + default_set_cp!(perm_v!(1)), deallocate!(), goto_execute!(354, 0), // goto run_cleaners_without_handling/0, 354. trust_me!(), diff --git a/src/prolog/io.rs b/src/prolog/io.rs index 8418d88e..a91c8603 100644 --- a/src/prolog/io.rs +++ b/src/prolog/io.rs @@ -205,6 +205,8 @@ impl fmt::Display for BuiltInInstruction { match self { &BuiltInInstruction::CleanUpBlock => write!(f, "clean_up_block"), + &BuiltInInstruction::DefaultSetCutPoint(r) => + write!(f, "default_set_cp {}", r), &BuiltInInstruction::DefaultTrustMe => write!(f, "default_trust_me"), &BuiltInInstruction::InstallInferenceCounter(r1, r2, r3) => diff --git a/src/prolog/machine/machine_state_impl.rs b/src/prolog/machine/machine_state_impl.rs index 5d5059bf..4cc71ee7 100644 --- a/src/prolog/machine/machine_state_impl.rs +++ b/src/prolog/machine/machine_state_impl.rs @@ -1218,6 +1218,10 @@ impl MachineState { self.compare_numbers(cmp, n1, n2); }, + &BuiltInInstruction::DefaultSetCutPoint(r) => { + let mut default_cut_policy = DefaultCutPolicy {}; + default_cut_policy.cut(self, r); + }, &BuiltInInstruction::DefaultTrustMe => { let mut call_policy = DefaultCallPolicy {}; try_or_fail!(self, call_policy.trust_me(self)); @@ -1472,7 +1476,9 @@ impl MachineState { self.p += 1; }, - &BuiltInInstruction::SetCutPoint(r) => { + &BuiltInInstruction::SetCutPoint(r) => + cut_policy.cut(self, r), + /*{ let addr = self.store(self.deref(self[r].clone())); match addr { @@ -1487,7 +1493,7 @@ impl MachineState { }, _ => self.fail = true }; - }, + },*/ &BuiltInInstruction::CleanUpBlock => { let nb = self.store(self.deref(self[temp_v!(1)].clone())); diff --git a/src/prolog/macros.rs b/src/prolog/macros.rs index 4dc1e785..d06aa922 100644 --- a/src/prolog/macros.rs +++ b/src/prolog/macros.rs @@ -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 { () => ( Line::BuiltIn(BuiltInInstruction::DefaultTrustMe) diff --git a/src/tests.rs b/src/tests.rs index b6b227df..d5f316ce 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -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,X] =@= [V,W,V]."); 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] -- 2.54.0