bracket RHS when necessary in variable equations

This commit is contained in:
Mark Thom
2019-03-24 15:26:32 -06:00
parent 3ad1b86286
commit 7ff7edee59
3 changed files with 16 additions and 11 deletions

View File

@@ -147,7 +147,7 @@ impl MachineState {
Addr::Con(Constant::Number(Number::Integer(ref n))) Addr::Con(Constant::Number(Number::Integer(ref n)))
if !n.is_negative() => { if !n.is_negative() => {
let n = offset + n.as_ref(); let n = offset + n.as_ref();
let i = n.mod_floor(&BigInt::from(26)).to_usize().unwrap(); let i = n.mod_floor(&BigInt::from(26)).to_usize().unwrap();
let j = n.div_floor(&BigInt::from(26)); let j = n.div_floor(&BigInt::from(26));
@@ -168,6 +168,7 @@ pub struct HCPrinter<'a, Outputter> {
outputter: Outputter, outputter: Outputter,
machine_st: &'a MachineState, machine_st: &'a MachineState,
state_stack: Vec<TokenOrRedirect>, state_stack: Vec<TokenOrRedirect>,
toplevel_spec: Option<DirectedOp>,
heap_locs: ReverseHeapVarDict, heap_locs: ReverseHeapVarDict,
printed_vars: HashSet<Addr>, printed_vars: HashSet<Addr>,
last_item_idx: usize, last_item_idx: usize,
@@ -276,6 +277,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
machine_st, machine_st,
state_stack: vec![], state_stack: vec![],
heap_locs: ReverseHeapVarDict::new(), heap_locs: ReverseHeapVarDict::new(),
toplevel_spec: None,
printed_vars: HashSet::new(), printed_vars: HashSet::new(),
last_item_idx: 0, last_item_idx: 0,
numbervars: false, numbervars: false,
@@ -290,7 +292,9 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
{ {
let mut printer = Self::new(machine_st, output); 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.heap_locs = reverse_heap_locs(machine_st, heap_locs);
printer printer
} }
@@ -512,7 +516,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
push_space_if_amb!(self, &output_str, { push_space_if_amb!(self, &output_str, {
self.append_str(&output_str.trim()); self.append_str(&output_str.trim());
}); });
}, },
Constant::Number(n) => { Constant::Number(n) => {
let output_str = format!("{}", n); let output_str = format!("{}", n);
@@ -670,7 +674,8 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter>
self.append_str(", ") self.append_str(", ")
} }
} else if !iter.stack().is_empty() { } 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 { } else {
break; break;
} }

View File

@@ -411,11 +411,11 @@ impl Machine {
EvalSession::from(SessionError::QueryFailure) EvalSession::from(SessionError::QueryFailure)
} }
} }
pub fn toplevel_heap_view<Outputter>(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter pub fn toplevel_heap_view<Outputter>(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter
where Outputter: HCValueOutputter where Outputter: HCValueOutputter
{ {
let mut sorted_vars: Vec<(&Rc<Var>, &Addr)> = var_dir.iter().collect(); let mut sorted_vars: Vec<_> = var_dir.iter().collect();
sorted_vars.sort_by_key(|ref v| v.0); sorted_vars.sort_by_key(|ref v| v.0);
for (var, addr) in sorted_vars { for (var, addr) in sorted_vars {
@@ -424,7 +424,7 @@ impl Machine {
if addr.is_ref() { if addr.is_ref() {
continue; continue;
} }
output = self.machine_st.print_var_eq(var.clone(), addr, var_dir, output); output = self.machine_st.print_var_eq(var.clone(), addr, var_dir, output);
} }

View File

@@ -1682,7 +1682,7 @@ fn test_queries_on_builtins()
[["X = '\\b\\r\\f\\t\\n'"]]); [["X = '\\b\\r\\f\\t\\n'"]]);
assert_prolog_success!(&mut wam, "?- X = ((*)=(*)).", assert_prolog_success!(&mut wam, "?- X = ((*)=(*)).",
[["X = (*)=(*)"]]); [["X = ((*)=(*))"]]);
assert_prolog_success!(&mut wam, "?- X = [.,.(.,.,.)].", assert_prolog_success!(&mut wam, "?- X = [.,.(.,.,.)].",
[["X = ['.', '.'('.', '.', '.')]"]]); [["X = ['.', '.'('.', '.', '.')]"]]);
assert_prolog_success!(&mut wam, "?- X = a+(b*c).", assert_prolog_success!(&mut wam, "?- X = a+(b*c).",
@@ -1696,9 +1696,9 @@ fn test_queries_on_builtins()
assert_prolog_success!(&mut wam, "?- X = (-)-(-).", assert_prolog_success!(&mut wam, "?- X = (-)-(-).",
[["X = (-)-(-)"]]); [["X = (-)-(-)"]]);
assert_prolog_success!(&mut wam, "?- X = ((:-):-(:-)).", assert_prolog_success!(&mut wam, "?- X = ((:-):-(:-)).",
[["X = (:-):-(:-)"]]); [["X = ((:-):-(:-))"]]);
assert_prolog_success!(&mut wam, "?- X = (a:-b,c).", 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)).", assert_prolog_success!(&mut wam, "?- X = f((f:-a,b,c)).",
[["X = f((f:-a,b,c))"]]); [["X = f((f:-a,b,c))"]]);
assert_prolog_success!(&mut wam, "?- 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], Vs = [X,Y],
variables_set_zdd(Vs, ZDD), variables_set_zdd(Vs, ZDD),
X = 1.", 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) ) ), assert_prolog_success!(&mut wam, "?- ZDD = ( X -> b(true) ; ( Y -> b(true) ; b(false) ) ),
Vs = [X,Y], Vs = [X,Y],
variables_set_zdd(Vs, ZDD), variables_set_zdd(Vs, ZDD),
X = 0.", 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))"]]);
} }