use std::cell::{Cell}; use std::vec::{Vec}; pub type Var = String; pub type Atom = String; #[derive(Debug)] pub enum TopLevel { Fact(Term), Query(Term) } #[derive(Debug)] pub enum Term { Atom(Cell, Atom), Clause(Cell, Atom, Vec>), Var(Cell, Var) } pub enum FactInstruction { GetStructure(Atom, usize, usize), UnifyVariable(usize), UnifyValue(usize) } pub enum QueryInstruction { PutStructure(Atom, usize, usize), SetVariable(usize), SetValue(usize), } pub type CompiledFact = Vec; pub type CompiledQuery = Vec; #[derive(Clone, Copy, PartialEq)] pub enum Addr { HeapCell(usize), RegNum(usize) } impl Term { pub fn set_cell(&self, cell_num: usize) { match self { &Term::Atom(ref cell, _) => cell.set(cell_num), &Term::Clause(ref cell, _, _) => cell.set(cell_num), &Term::Var(ref cell, _) => cell.set(cell_num) }; } }