gather_freeze_goals(Attrs, _, _) :-
var(Attrs), !.
-gather_freeze_goals([frozen(X) | _], Var, [frozen(Var, X) | _]) :-
+gather_freeze_goals([frozen(X) | _], Var, [freeze(Var, X) | _]) :-
!.
gather_freeze_goals([_ | Attrs], Var, Goals) :-
gather_freeze_goals(Attrs, Var, Goals).
Ok(())
}
- pub fn remove_unbound_vars(&self, heap_locs: &mut HeapVarDict) {
- for (var, addr) in heap_locs.clone() {
+ pub fn remove_unbound_vars(&self, orig_heap_locs: &HeapVarDict, heap_locs: &mut HeapVarDict) {
+ for (var, addr) in orig_heap_locs.iter() {
match self.machine_st.store(self.machine_st.deref(addr.clone())) {
- new_addr =>
- if addr.is_ref() && new_addr == addr {
- heap_locs.remove(&var);
- }
+ new_addr => if new_addr.is_ref() {
+ heap_locs.remove(var);
+ }
}
}
}
pub fn print(wam: &mut Machine, result: EvalSession) {
match result {
- EvalSession::InitialQuerySuccess(alloc_locs, mut heap_locs) => {
+ EvalSession::InitialQuerySuccess(alloc_locs, mut heap_locs) => {
+ let orig_heap_locs = heap_locs.clone();
+
loop {
- wam.remove_unbound_vars(&mut heap_locs);
-
+ wam.remove_unbound_vars(&orig_heap_locs, &mut heap_locs);
+
if wam.or_stack_is_empty() {
if heap_locs.is_empty() {
- println!("true.");
+ let attr_goals = wam.attribute_goals(&orig_heap_locs);
+
+ if !attr_goals.is_empty() {
+ println!("{}.", attr_goals);
+ } else {
+ println!("true.");
+ }
+
return;
}
- } else if heap_locs.is_empty() {
+ } else if heap_locs.is_empty() && orig_heap_locs.is_empty() {
print!("true");
stdout().flush().unwrap();
}
-
+
let mut raw_stdout = stdout().into_raw_mode().unwrap();
if !heap_locs.is_empty() {
- let mut output = PrinterOutputter::new();
+ let mut output = PrinterOutputter::new();
let bindings = wam.heap_view(&heap_locs, output).result();
-
+
write!(raw_stdout, "{}", bindings).unwrap();
raw_stdout.flush().unwrap();
+ }
- let attr_goals = wam.attribute_goals(&heap_locs);
+ let attr_goals = wam.attribute_goals(&orig_heap_locs);
- if !attr_goals.is_empty() {
- write!(raw_stdout, "\r\n{}\r\n", attr_goals).unwrap();
+ if !attr_goals.is_empty() {
+ if heap_locs.is_empty() {
+ write!(raw_stdout, "{}", attr_goals).unwrap();
+ } else {
+ write!(raw_stdout, ", {}", attr_goals).unwrap();
}
}
write!(raw_stdout, "{}\r\n", error_string(e)).unwrap();
raw_stdout.flush().unwrap();
return;
- }
+ }
} else {
- if heap_locs.is_empty() {
+ if heap_locs.is_empty() && attr_goals.is_empty() {
write!(raw_stdout, "true.\r\n").unwrap();
} else {
write!(raw_stdout, ".\r\n").unwrap();