Var(Var)
}
-impl Term {
- pub fn name(&self) -> &Atom {
- match self {
- &Term::Atom(ref atom) => atom,
- &Term::Var(ref var) => var,
- &Term::Clause(ref atom, _) => atom
- }
- }
-
- pub fn is_variable(&self) -> bool {
- if let &Term::Var(_) = self {
- return true;
- }
-
- return false;
- }
-}
-
#[derive(Clone)]
pub enum MachineInstruction {
GetStructure(Atom, usize, usize),
let mut counter : usize = max_reg_used; // r + 1;
for t in terms {
- if t.is_variable() && !variable_allocs.contains_key(t.name()) {
- counter += 1;
- variable_allocs.insert(t.name(), (counter, false));
- } else if !t.is_variable() {
+ if let &Term::Var(ref var) = t.as_ref() {
+ if !variable_allocs.contains_key(var) {
+ counter += 1;
+ variable_allocs.insert(var, (counter, false));
+ }
+ } else {
counter += 1;
}
}
max_reg_used = counter;
for t in terms.iter().rev() {
- if t.is_variable() {
+ if let &Term::Var(_) = t.as_ref() {
counter -= 1;
continue;
}
let mut counter : usize = reg;
for t in terms {
- if t.is_variable() && !variable_allocs.contains_key(t.name()) {
- variable_allocs.insert(t.name(), counter);
- fact.push(MachineInstruction::UnifyVariable(counter));
- counter += 1;
- } else if t.is_variable() {
- let r = variable_allocs.get(t.name()).unwrap();
- fact.push(MachineInstruction::UnifyValue(*r));
+ if let &Term::Var(ref var) = t.as_ref() {
+ if !variable_allocs.contains_key(var) {
+ variable_allocs.insert(var, counter);
+ fact.push(MachineInstruction::UnifyVariable(counter));
+ counter += 1;
+ } else {
+ let r = variable_allocs.get(var).unwrap();
+ fact.push(MachineInstruction::UnifyValue(*r));
+ }
} else {
fact.push(MachineInstruction::UnifyVariable(counter));
queue.push_back((counter, t));