]> Repositorios git - scryer-prolog.git/commitdiff
bracket RHS when necessary in variable equations
authorMark Thom <[email protected]>
Sun, 24 Mar 2019 21:26:32 +0000 (15:26 -0600)
committerMark Thom <[email protected]>
Sun, 24 Mar 2019 21:26:32 +0000 (15:26 -0600)
src/prolog/heap_print.rs
src/prolog/machine/mod.rs
src/tests.rs

index 584d0c0e8ec1d33678f501bd93ff4d597d5ed94b..9f9d7ff17596781810c4018a0393abb065267369 100644 (file)
@@ -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<TokenOrRedirect>,
+    toplevel_spec: Option<DirectedOp>,
     heap_locs:    ReverseHeapVarDict,
     printed_vars: HashSet<Addr>,
     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;
             }
index ccdb2623bca510019cd925ce38ec3406a1dafb51..4b5c42bf0ed0574d991568dc62abc912a1910b55 100644 (file)
@@ -411,11 +411,11 @@ impl Machine {
             EvalSession::from(SessionError::QueryFailure)
         }
     }
-
+    
     pub fn toplevel_heap_view<Outputter>(&self, var_dir: &HeapVarDict, mut output: Outputter) -> Outputter
        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);
 
         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);
         }
 
index c499f0913299de192f143f749ff31eec7c65f184..94c0454bbe71bdb2086575d9bf4d08c4c09c2648 100644 (file)
@@ -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))"]]);
 }