From 7ff7edee5916c8c9065434b2ea614309ff05cd46 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 24 Mar 2019 15:26:32 -0600 Subject: [PATCH] bracket RHS when necessary in variable equations --- src/prolog/heap_print.rs | 11 ++++++++--- src/prolog/machine/mod.rs | 6 +++--- src/tests.rs | 10 +++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/prolog/heap_print.rs b/src/prolog/heap_print.rs index 584d0c0e..9f9d7ff1 100644 --- a/src/prolog/heap_print.rs +++ b/src/prolog/heap_print.rs @@ -147,7 +147,7 @@ impl MachineState { Addr::Con(Constant::Number(Number::Integer(ref n))) if !n.is_negative() => { let n = offset + n.as_ref(); - + let i = n.mod_floor(&BigInt::from(26)).to_usize().unwrap(); let j = n.div_floor(&BigInt::from(26)); @@ -168,6 +168,7 @@ pub struct HCPrinter<'a, Outputter> { outputter: Outputter, machine_st: &'a MachineState, state_stack: Vec, + toplevel_spec: Option, heap_locs: ReverseHeapVarDict, printed_vars: HashSet, last_item_idx: usize, @@ -276,6 +277,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> machine_st, state_stack: vec![], heap_locs: ReverseHeapVarDict::new(), + toplevel_spec: None, printed_vars: HashSet::new(), last_item_idx: 0, numbervars: false, @@ -290,7 +292,9 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { let mut printer = Self::new(machine_st, output); + printer.toplevel_spec = Some(DirectedOp::Right(clause_name!("="), (700, XFX))); printer.heap_locs = reverse_heap_locs(machine_st, heap_locs); + printer } @@ -512,7 +516,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> push_space_if_amb!(self, &output_str, { self.append_str(&output_str.trim()); - }); + }); }, Constant::Number(n) => { let output_str = format!("{}", n); @@ -670,7 +674,8 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> self.append_str(", ") } } else if !iter.stack().is_empty() { - self.handle_heap_term(&mut iter, None, false); + let spec = self.toplevel_spec.take(); + self.handle_heap_term(&mut iter, spec, false); } else { break; } diff --git a/src/prolog/machine/mod.rs b/src/prolog/machine/mod.rs index ccdb2623..4b5c42bf 100644 --- a/src/prolog/machine/mod.rs +++ b/src/prolog/machine/mod.rs @@ -411,11 +411,11 @@ impl Machine { EvalSession::from(SessionError::QueryFailure) } } - + pub fn toplevel_heap_view(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter where Outputter: HCValueOutputter { - let mut sorted_vars: Vec<(&Rc, &Addr)> = var_dir.iter().collect(); + let mut sorted_vars: Vec<_> = var_dir.iter().collect(); sorted_vars.sort_by_key(|ref v| v.0); for (var, addr) in sorted_vars { @@ -424,7 +424,7 @@ impl Machine { if addr.is_ref() { continue; } - + output = self.machine_st.print_var_eq(var.clone(), addr, var_dir, output); } diff --git a/src/tests.rs b/src/tests.rs index c499f091..94c0454b 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1682,7 +1682,7 @@ fn test_queries_on_builtins() [["X = '\\b\\r\\f\\t\\n'"]]); assert_prolog_success!(&mut wam, "?- X = ((*)=(*)).", - [["X = (*)=(*)"]]); + [["X = ((*)=(*))"]]); assert_prolog_success!(&mut wam, "?- X = [.,.(.,.,.)].", [["X = ['.', '.'('.', '.', '.')]"]]); assert_prolog_success!(&mut wam, "?- X = a+(b*c).", @@ -1696,9 +1696,9 @@ fn test_queries_on_builtins() assert_prolog_success!(&mut wam, "?- X = (-)-(-).", [["X = (-)-(-)"]]); assert_prolog_success!(&mut wam, "?- X = ((:-):-(:-)).", - [["X = (:-):-(:-)"]]); + [["X = ((:-):-(:-))"]]); assert_prolog_success!(&mut wam, "?- X = (a:-b,c).", - [["X = a:-b,c"]]); + [["X = (a:-b,c)"]]); assert_prolog_success!(&mut wam, "?- X = f((f:-a,b,c)).", [["X = f((f:-a,b,c))"]]); assert_prolog_success!(&mut wam, "?- X = f((f:-a,(b,c))).", @@ -2409,10 +2409,10 @@ fn test_queries_on_attributed_variables() Vs = [X,Y], variables_set_zdd(Vs, ZDD), X = 1.", - [["X = 1", "Y = 0", "Vs = [1, 0]", "ZDD = 1->b(true);0->b(true);b(false)"]]); + [["X = 1", "Y = 0", "Vs = [1, 0]", "ZDD = (1->b(true);0->b(true);b(false))"]]); assert_prolog_success!(&mut wam, "?- ZDD = ( X -> b(true) ; ( Y -> b(true) ; b(false) ) ), Vs = [X,Y], variables_set_zdd(Vs, ZDD), X = 0.", - [["Vs = [0, _58]", "X = 0", "Y = _58", "ZDD = 0->b(true);_58->b(true);b(false)"]]); + [["Vs = [0, _58]", "X = 0", "Y = _58", "ZDD = (0->b(true);_58->b(true);b(false))"]]); } -- 2.54.0