discard CodeIndex literals from unfolded control operators in preprocessor (#1791)
This commit is contained in:
@@ -399,7 +399,7 @@ fn check_for_internal_if_then(terms: &mut Vec<Term>) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(Term::Clause(_, name, ref subterms)) = terms.last() {
|
if let Some(Term::Clause(_, name, ref subterms)) = terms.last() {
|
||||||
if *name != atom!("->") || subterms.len() != 2 {
|
if *name != atom!("->") || source_arity(subterms) != 2 {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -770,7 +770,7 @@ impl Preprocessor {
|
|||||||
Term::Var(_, ref v) if v.as_str() == "!" => {
|
Term::Var(_, ref v) if v.as_str() == "!" => {
|
||||||
Ok(QueryTerm::UnblockedCut(Cell::default()))
|
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) => {
|
(atom!(";"), 2) => {
|
||||||
let term = Term::Clause(r, name, terms);
|
let term = Term::Clause(r, name, terms);
|
||||||
|
|
||||||
@@ -900,7 +900,7 @@ impl Preprocessor {
|
|||||||
let mut term = term;
|
let mut term = term;
|
||||||
|
|
||||||
if let Term::Clause(cell, name, terms) = 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 term = Term::Clause(cell, name, terms);
|
||||||
let mut subterms = unfold_by_str(term, atom!(","));
|
let mut subterms = unfold_by_str(term, atom!(","));
|
||||||
|
|
||||||
|
|||||||
@@ -626,8 +626,25 @@ impl Term {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[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)> {
|
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 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 {
|
if name == &s && subterms.len() == 2 {
|
||||||
let snd = subterms.pop().unwrap();
|
let snd = subterms.pop().unwrap();
|
||||||
let fst = subterms.pop().unwrap();
|
let fst = subterms.pop().unwrap();
|
||||||
|
|||||||
Reference in New Issue
Block a user