}
if let Some(Term::Clause(_, name, ref subterms)) = terms.last() {
- if *name != atom!("->") || subterms.len() != 2 {
+ if *name != atom!("->") || source_arity(subterms) != 2 {
return;
}
} else {
Term::Var(_, ref v) if v.as_str() == "!" => {
Ok(QueryTerm::UnblockedCut(Cell::default()))
}
- Term::Clause(r, name, mut terms) => match (name, terms.len()) {
+ Term::Clause(r, name, mut terms) => match (name, source_arity(&terms)) {
(atom!(";"), 2) => {
let term = Term::Clause(r, name, terms);
let mut term = term;
if let Term::Clause(cell, name, terms) = term {
- if name == atom!(",") && terms.len() == 2 {
+ if name == atom!(",") && source_arity(&terms) == 2 {
let term = Term::Clause(cell, name, terms);
let mut subterms = unfold_by_str(term, atom!(","));
}
}
+#[inline]
+pub fn source_arity(terms: &[Term]) -> usize {
+ if let Some(last_arg) = terms.last() {
+ if let Term::Literal(_, Literal::CodeIndex(_)) = last_arg {
+ return terms.len() - 1;
+ }
+ }
+
+ terms.len()
+}
+
fn unfold_by_str_once(term: &mut Term, s: Atom) -> Option<(Term, Term)> {
if let Term::Clause(_, ref name, ref mut subterms) = term {
+ if let Some(last_arg) = subterms.last() {
+ if let Term::Literal(_, Literal::CodeIndex(_)) = last_arg {
+ subterms.pop();
+ }
+ }
+
if name == &s && subterms.len() == 2 {
let snd = subterms.pop().unwrap();
let fst = subterms.pop().unwrap();