]> Repositorios git - scryer-prolog.git/commitdiff
optimized up to chapter 6
authorMark Thom <[email protected]>
Mon, 10 Apr 2017 01:12:36 +0000 (19:12 -0600)
committerMark Thom <[email protected]>
Mon, 10 Apr 2017 01:12:36 +0000 (19:12 -0600)
12 files changed:
Cargo.lock
Cargo.toml
README.md
src/main.rs
src/prolog/and_stack.rs
src/prolog/ast.rs
src/prolog/codegen.rs
src/prolog/io.rs
src/prolog/machine.rs
src/prolog/or_stack.rs
src/prolog/prolog_parser.lalrpop
src/prolog/prolog_parser.rs

index 71e9dd19b0f4a5d6f05eeb8361e813622c56fac4..0a0e3a0beaf807dd9c085dd2abb328c627f3b440 100644 (file)
@@ -1,6 +1,6 @@
 [root]
 name = "rusty-wam"
-version = "0.5.11"
+version = "0.5.12"
 dependencies = [
  "lalrpop 0.12.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "lalrpop-util 0.12.5 (registry+https://github.com/rust-lang/crates.io-index)",
index ac297e7810208ca55f0e42968a6a547636803587..ad5d42ae463acce7fffefb180ff2684dcde72e3a 100644 (file)
@@ -1,6 +1,6 @@
 [package]
 name = "rusty-wam"
-version = "0.5.11"
+version = "0.5.12"
 authors = ["Mark Thom"]
 
 build = "build.rs"
@@ -12,5 +12,4 @@ version = "1.2.0"
 version = "0.12.5"
 
 [build-dependencies.lalrpop]
-version = "0.12.5"
-
+version = "0.12.5"
\ No newline at end of file
index 7ad4cf3c9ec9138280d5b7cf6d493f75fd528ff3..834bfb01131792e10026e8c7456e539e28d36897 100644 (file)
--- a/README.md
+++ b/README.md
@@ -8,11 +8,11 @@ pure Prolog.
 
 ## Progress
 
-Pure Prolog is implemented as a simple REPL. "Pure Prolog" is Prolog
-without cut, meta- or extra-logical operators, or side effects of any
-kind. In terms of the tutorial pacing, the work has progressed to the
-end of section 5.10, skipping past 5.4. Atoms and lists are the only
-two data types currently supported.
+Prolog is implemented as a simple REPL. It is without without meta- or
+extra-logical operators, or side effects of any kind, with the lone
+exception of cut. In terms of the tutorial pacing, the work has
+progressed to the end of section 5.11, skipping past 5.4. Atoms and
+lists are the only two data types currently supported.
 
 While proper environment trimming code is emitted by the code
 generator, it has no effect on the bytecode WAM, which lacks
index 949abd37369e26de52b1a3b7a5da8eeda7bb3f0b..1be7e77937f4823d0bfb0777a3251630d518b6d7 100644 (file)
@@ -194,6 +194,87 @@ mod tests {
         assert_eq!(submit(&mut wam, "?- p(X).").failed_query(), false);
     }
 
+    #[test]
+    fn test_queries_on_cuts() {
+        let mut wam = Machine::new();
+
+        // test shallow cuts.
+        submit(&mut wam, "memberchk(X, [X|_]) :- !.
+                          memberchk(X, [_|Xs]) :- !, memberchk(X, Xs).");
+
+        assert_eq!(submit(&mut wam, "?- memberchk(X, [a,b,c]).").failed_query(), false);
+        assert_eq!(submit(&mut wam, "?- memberchk([X,X], [a,b,c,[d,e],[d,d]]).").failed_query(), false);
+        assert_eq!(submit(&mut wam, "?- memberchk([X,X], [a,b,c,[D,d],[e,e]]).").failed_query(), false);
+        assert_eq!(submit(&mut wam, "?- memberchk([X,X], [a,b,c,[e,d],[f,e]]).").failed_query(), true);
+        assert_eq!(submit(&mut wam, "?- memberchk([X,X,Y], [a,b,c,[e,d],[f,e]]).").failed_query(), true);
+        assert_eq!(submit(&mut wam, "?- memberchk([X,X,Y], [a,b,c,[e,e,d],[f,e]]).").failed_query(), false);
+
+        // test deep cuts.
+        submit(&mut wam, "commit :- a, !.");        
+
+        assert_eq!(submit(&mut wam, "?- commit.").failed_query(), true);
+        
+        submit(&mut wam, "a.");
+
+        assert_eq!(submit(&mut wam, "?- commit.").failed_query(), false);
+
+        submit(&mut wam, "commit(X) :- a(X), !.");
+
+        assert_eq!(submit(&mut wam, "?- commit(X).").failed_query(), true);
+
+        submit(&mut wam, "a(x).");
+
+        assert_eq!(submit(&mut wam, "?- commit(X).").failed_query(), false);
+
+        submit(&mut wam, "a :- b, !, c. a :- d.");
+
+        assert_eq!(submit(&mut wam, "?- a.").failed_query(), true);
+
+        submit(&mut wam, "b.");
+
+        assert_eq!(submit(&mut wam, "?- a.").failed_query(), true);
+
+        submit(&mut wam, "d.");
+
+        // we've committed to the first clause since the query on b
+        // succeeds, so we expect failure here.
+        assert_eq!(submit(&mut wam, "?- a.").failed_query(), true);
+
+        submit(&mut wam, "c.");
+
+        assert_eq!(submit(&mut wam, "?- a.").failed_query(), false);
+
+        submit(&mut wam, "a(X) :- b, !, c(X). a(X) :- d(X).");
+
+        assert_eq!(submit(&mut wam, "?- a(X).").failed_query(), true);
+
+        submit(&mut wam, "c(c).");
+        submit(&mut wam, "d(d).");
+
+        assert_eq!(submit(&mut wam, "?- a(X).").failed_query(), false);
+
+        submit(&mut wam, "b.");
+
+        assert_eq!(submit(&mut wam, "?- a(X).").failed_query(), false);
+
+        wam.clear();
+
+        assert_eq!(submit(&mut wam, "?- c(X).").failed_query(), true);
+        
+        submit(&mut wam, "a(X) :- b, c(X), !. a(X) :- d(X).");
+        submit(&mut wam, "b.");
+
+        assert_eq!(submit(&mut wam, "?- a(X).").failed_query(), true);
+
+        submit(&mut wam, "d(d).");
+
+        assert_eq!(submit(&mut wam, "?- a(X).").failed_query(), false);
+
+        submit(&mut wam, "c(c).");
+        
+        assert_eq!(submit(&mut wam, "?- a(X).").failed_query(), false);
+    }
+    
     #[test]
     fn test_queries_on_lists() {
         let mut wam = Machine::new();
index 229b221b55e93da365e6007a759552a24af27a1f..ff17f2b0827105b11566b5019ede34a845a20172 100644 (file)
@@ -5,6 +5,7 @@ use std::vec::Vec;
 
 pub struct Frame {
     pub global_index: usize,
+    pub b0: usize,
     pub e: usize,
     pub cp: CodePtr,
     perms: Vec<Addr>
@@ -14,6 +15,7 @@ impl Frame {
     fn new(global_index: usize, e: usize, cp: CodePtr, n: usize) -> Self {
         Frame {
             global_index: global_index,
+            b0: 0,
             e: e,
             cp: cp,
             perms: vec![Addr::HeapCell(0); n]
index 882907956daeb83aa129b98970a4f8a43c4c702f..c7ec620769fcaaec9043d4ced3c5616a8d075832 100644 (file)
@@ -119,13 +119,27 @@ pub enum Term {
     Var(Cell<VarReg>, Var)
 }
 
+pub enum TermOrCut {
+    Cut,
+    Term(Term)
+}
+
+impl TermOrCut {    
+    pub fn arity(&self) -> usize {
+        match self {
+            &TermOrCut::Term(ref term) => term.arity(),
+            _ => 0
+        }
+    }
+}
+
 pub struct Rule {
-    pub head: (Term, Term),
-    pub clauses: Vec<Term>
+    pub head: (Term, TermOrCut),
+    pub clauses: Vec<TermOrCut>
 }
 
-impl Rule {    
-    pub fn last_clause(&self) -> &Term {
+impl Rule {
+    pub fn last_clause(&self) -> &TermOrCut {
         match self.clauses.last() {
             None => &self.head.1,
             Some(clause) => clause
@@ -141,12 +155,22 @@ pub enum TermRef<'a> {
     Var(Level, &'a Cell<VarReg>, &'a Var)
 }
 
-pub enum ChoiceInstruction {    
-    RetryMeElse(usize),        
-    TrustMe,    
+pub enum ChoiceInstruction {
+    RetryMeElse(usize),
+    TrustMe,
     TryMeElse(usize)
 }
 
+pub enum Terminal {
+    Terminal, Non
+}
+
+pub enum CutInstruction {
+    Cut(Terminal),
+    GetLevel,
+    NeckCut(Terminal)
+}
+
 pub enum IndexedChoiceInstruction {
     Retry(usize),
     Trust(usize),
@@ -223,6 +247,7 @@ pub type CompiledQuery = Vec<QueryInstruction>;
 pub enum Line {
     Choice(ChoiceInstruction),
     Control(ControlInstruction),
+    Cut(CutInstruction),
     Fact(CompiledFact),
     Indexing(IndexingInstruction),
     IndexedChoice(IndexedChoiceInstruction),
@@ -373,18 +398,18 @@ impl Term {
         match self {
             &Term::Clause(_, _, ref terms) =>
                 terms.first().map(|bt| bt.as_ref()),
-            _ => None                
+            _ => None
         }
     }
-    
+
     pub fn is_clause(&self) -> bool {
         if let &Term::Clause(_, _, _) = self {
             true
         } else {
             false
         }
-    }        
-    
+    }
+
     pub fn subterms(&self) -> usize {
         match self {
             &Term::Clause(_, _, ref terms) => terms.len(),
index b6d868f9e1c472c563b1b20ab884d7f20433ac27..d2ed6a7a3ba5e5a6066a5c3fd01e73c8aeb31b0b 100644 (file)
@@ -441,9 +441,9 @@ impl CodeOffsets {
             IntIndex::External(o) => o + prelude_len + 1,
             IntIndex::Fail => 0,
             IntIndex::Internal(_) => prelude_len - lst_offset + 1
-        }        
+        }
     }
-    
+
     fn add_indices(self, code: &mut Code, mut code_body: Code)
     {
         if self.no_indices() {
@@ -470,11 +470,11 @@ impl CodeOffsets {
                 _ => {}
             }
         }
-                
+
         let str_loc = Self::switch_on_str_offset_from(str_loc, prelude.len(), con_loc);
         let con_loc = Self::switch_on_con_offset_from(con_loc, prelude.len());
         let lst_loc = Self::switch_on_lst_offset_from(lst_loc, prelude.len(), lst_offset);
-        
+
         let switch_instr = IndexingInstruction::SwitchOnTerm(prelude.len() + 1,
                                                              con_loc,
                                                              lst_loc,
@@ -752,21 +752,40 @@ impl<'a> CodeGenerator<'a> {
         }
     }
 
-    fn mark_perm_vars(rule: &'a Rule) -> VariableFixtures {
+    fn mark_perm_vars(rule: &'a Rule) -> (VariableFixtures, bool)
+    {
         let &Rule { head: (ref p0, ref p1), ref clauses } = rule;
-        let mut vs = HashMap::new();
-
-        let iter = p0.breadth_first_iter().chain(p1.breadth_first_iter());
-
-        Self::mark_vars_in_term(iter, &mut vs, 0);
+        let mut vs = HashMap::new();        
+        
+        match p1 {
+            &TermOrCut::Cut => {
+                let iter = p0.breadth_first_iter();
+                Self::mark_vars_in_term(iter, &mut vs, 0);
+            },
+            &TermOrCut::Term(ref p1) => {
+                let iter = p0.breadth_first_iter().chain(p1.breadth_first_iter());
+                Self::mark_vars_in_term(iter, &mut vs, 0);
+            }
+        }
 
         for (i, term) in clauses.iter().enumerate() {
-            Self::mark_vars_in_term(term.breadth_first_iter(), &mut vs, i + 1);
+            if let &TermOrCut::Term(ref term) = term {
+                Self::mark_vars_in_term(term.breadth_first_iter(), &mut vs, i + 1)
+            }
         }
 
+        let mut deep_cuts = false;
+
+        for term in clauses {
+            if let &TermOrCut::Cut = term {
+                deep_cuts = true;
+                break;
+            }
+        }
+        
         Self::set_perm_vals(&vs);
 
-        vs
+        (vs, deep_cuts)
     }
 
     fn add_conditional_call(compiled_query: &mut Code, term: &Term, pvs: usize)
@@ -787,8 +806,8 @@ impl<'a> CodeGenerator<'a> {
     fn vars_above_threshold(vs: &VariableFixtures, index: usize) -> usize {
         let mut var_count = 0;
 
-        for &(term_status, _) in vs.values() {
-            if let VarStatus::Permanent(i) = term_status {
+        for &(var_status, _) in vs.values() {
+            if let VarStatus::Permanent(i) = var_status {
                 if i > index {
                     var_count += 1;
                 }
@@ -803,8 +822,8 @@ impl<'a> CodeGenerator<'a> {
         let mut dealloc_index = body.len() - 1;
 
         match rule.last_clause() {
-              &Term::Clause(_, ref name, _)
-            | &Term::Constant(_, Constant::Atom(ref name)) => {
+              &TermOrCut::Term(Term::Clause(_, ref name, _))
+            | &TermOrCut::Term(Term::Constant(_, Constant::Atom(ref name))) => {
                 if let &mut Line::Control(ref mut ctrl) = body.last_mut().unwrap() {
                     *ctrl = ControlInstruction::Execute(name.clone(), last_arity);
                 }
@@ -863,8 +882,9 @@ impl<'a> CodeGenerator<'a> {
         }
     }
 
-    pub fn compile_rule(&mut self, rule: &'a Rule) -> Code {
-        let vs = Self::mark_perm_vars(&rule);
+    pub fn compile_rule(&mut self, rule: &'a Rule) -> Code
+    {
+        let (vs, deep_cuts) = Self::mark_perm_vars(&rule);
         let &Rule { head: (ref p0, ref p1), ref clauses } = rule;
 
         let perm_vars = Self::vars_above_threshold(&vs, 0);
@@ -872,23 +892,63 @@ impl<'a> CodeGenerator<'a> {
 
         if clauses.len() > 0 {
             body.push(Line::Control(ControlInstruction::Allocate(perm_vars)));
+
+            if deep_cuts {
+                body.push(Line::Cut(CutInstruction::GetLevel));
+            }
         }
 
-        let iter = p0.breadth_first_iter().chain(p1.breadth_first_iter());
-        self.update_var_count(iter);
+        match p1 {
+            &TermOrCut::Cut => {
+                let iter = p0.breadth_first_iter();
+                self.update_var_count(iter);
+            },
+            &TermOrCut::Term(ref p1) => {
+                let iter = p0.breadth_first_iter().chain(p1.breadth_first_iter());
+                self.update_var_count(iter);
+            }
+        };
 
+        
         self.marker.advance(p0);
-        body.push(Line::Fact(self.compile_target(p0, false)));
 
-        self.marker.advance_at_head(p1);
-        body.push(Line::Query(self.compile_target(p1, false)));
+        if p0.is_clause() {
+            body.push(Line::Fact(self.compile_target(p0, false)));
+        }
+
+        match p1 {
+            &TermOrCut::Cut => {
+                let term = if clauses.is_empty() {
+                    Terminal::Terminal
+                } else {
+                    Terminal::Non
+                };
+                
+                body.push(Line::Cut(CutInstruction::NeckCut(term)));
+            },
+            &TermOrCut::Term(ref p1) => {
+                self.marker.advance_at_head(p1);
 
-        Self::add_conditional_call(&mut body, p1, perm_vars);
+                if p1.is_clause() {
+                    body.push(Line::Query(self.compile_target(p1, false)));
+                }
+                
+                Self::add_conditional_call(&mut body, p1, perm_vars);
+            }
+        };
 
         body = clauses.iter().enumerate()
             .map(|(i, term)| {
-                let num_vars = Self::vars_above_threshold(&vs, i+1);
-                self.compile_internal_query(term, num_vars)
+                match term {
+                    &TermOrCut::Cut if i + 1 < clauses.len() =>
+                        vec![Line::Cut(CutInstruction::Cut(Terminal::Non))],
+                    &TermOrCut::Cut =>
+                        vec![Line::Cut(CutInstruction::Cut(Terminal::Terminal))],
+                    &TermOrCut::Term(ref term) => {
+                        let num_vars = Self::vars_above_threshold(&vs, i + 1);
+                        self.compile_internal_query(term, num_vars)
+                    }
+                }
             })
             .fold(body, |mut body, ref mut cqs| {
                 body.append(cqs);
index 890091c483bb20d6e265a1dca82f6bfb4b13e3dd..5644e799bc5ddfef2e00c1b9dfa7e43d2f0704b5 100644 (file)
@@ -145,6 +145,19 @@ impl fmt::Display for IndexingInstruction {
     }
 }
 
+impl fmt::Display for CutInstruction {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            &CutInstruction::Cut(_) =>
+                write!(f, "cut"),
+            &CutInstruction::NeckCut(_) =>
+                write!(f, "neck_cut"),
+            &CutInstruction::GetLevel =>
+                write!(f, "get_level")
+        }
+    }
+}
+
 impl fmt::Display for Level {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match self {
@@ -198,6 +211,8 @@ pub fn print_code(code: &Code) {
                 for fact_instr in fact {
                     println!("{}", fact_instr);
                 },
+            &Line::Cut(ref cut) =>
+                println!("{}", cut),
             &Line::Choice(ref choice) =>
                 println!("{}", choice),
             &Line::Control(ref control) =>
index 0563401df8184146d0ea1f46c528a069aa30ede9..1bbb2738f927510eda3a4dfe26696eb3b14c5ea0 100644 (file)
@@ -19,6 +19,7 @@ struct MachineState {
     s: usize,
     p: CodePtr,
     b: usize,
+    b0: usize,
     e: usize,
     num_of_args: usize,
     cp: CodePtr,
@@ -82,7 +83,7 @@ impl Machine {
 
     pub fn add_fact(&mut self, fact: &Term, mut code: Code) {
         if let Some(name) = fact.name() {
-            let p = self.code.len();            
+            let p = self.code.len();
             let arity = fact.arity();
 
             self.code.append(&mut code);
@@ -121,6 +122,8 @@ impl Machine {
             match instr {
                 &Line::Choice(ref choice_instr) =>
                     self.ms.execute_choice_instr(choice_instr),
+                &Line::Cut(ref cut_instr) =>
+                    self.ms.execute_cut_instr(cut_instr),
                 &Line::Control(ref control_instr) =>
                     self.ms.execute_ctrl_instr(&self.code_dir, control_instr),
                 &Line::Fact(ref fact) => {
@@ -132,7 +135,7 @@ impl Machine {
                         self.ms.execute_fact_instr(&fact_instr);
                     }
                     self.ms.p += 1;
-                },                
+                },
                 &Line::Indexing(ref indexing_instr) =>
                     self.ms.execute_indexing_instr(&indexing_instr),
                 &Line::IndexedChoice(ref choice_instr) =>
@@ -146,21 +149,29 @@ impl Machine {
                         self.ms.execute_query_instr(&query_instr);
                     }
                     self.ms.p += 1;
-                }                
+                }
             }
 
             if self.failed() {
-                let p = self.ms
-                            .or_stack
-                            .top()
-                            .map(|fr| fr.bp)
-                            .unwrap_or_default();
+                let b0 = self.ms
+                    .or_stack
+                    .top()
+                    .map(|fr| fr.b0)
+                    .unwrap_or(0);
+                
+                let p = if self.ms.b > 0 {
+                    let b = self.ms.b - 1;
+                    self.ms.or_stack[b].bp
+                } else {
+                    CodePtr::TopLevel
+                };
 
                 if let CodePtr::TopLevel = p {
                     return false;
                 } else {
                     self.ms.fail = false;
                     self.ms.p = p;
+                    self.ms.b0 = b0;
                 }
             }
 
@@ -267,7 +278,11 @@ impl Machine {
     pub fn continue_query(&mut self) -> EvalResult
     {
         if !self.or_stack_is_empty() {
-            let b = self.ms.b;
+            if self.ms.b == 0 {
+                return EvalResult::QueryFailure;
+            }
+
+            let b = self.ms.b - 1;
             self.ms.p = self.ms.or_stack[b].bp;
 
             let succeeded = if let CodePtr::DirEntry(p) = self.ms.p {
@@ -286,6 +301,13 @@ impl Machine {
         }
     }
 
+    #[allow(dead_code)]
+    pub fn clear(&mut self) {
+        self.reset();
+        self.code.clear();
+        self.code_dir.clear();
+    }
+    
     pub fn reset(&mut self) {
         self.ms.reset();
     }
@@ -297,6 +319,7 @@ impl MachineState {
                        s: 0,
                        p: CodePtr::TopLevel,
                        b: 0,
+                       b0: 0,
                        e: 0,
                        num_of_args: 0,
                        cp: CodePtr::TopLevel,
@@ -419,7 +442,12 @@ impl MachineState {
             Ref::StackCell(fr, _) => {
                 let fr_gi = self.and_stack[fr].global_index;
                 let b_gi  = if !self.or_stack.is_empty() {
-                    self.or_stack[self.b].global_index
+                    if self.b > 0 {
+                        let b = self.b - 1;
+                        self.or_stack[b].global_index
+                    } else {
+                        0
+                    }
                 } else {
                     0
                 };
@@ -443,6 +471,48 @@ impl MachineState {
         }
     }
 
+    fn tidy_trail(&mut self) {
+        if self.b == 0 {
+            return;
+        }
+
+        let b = self.b - 1;
+        let mut i = self.or_stack[b].tr;
+
+        while i < self.tr {
+            let tr_i = self.trail[i];
+            let hb = self.hb;
+
+            match tr_i {
+                Ref::HeapCell(tr_i) =>
+                    if tr_i < hb { //|| ((h < tr_i) && tr_i < b) {
+                        i += 1;
+                    } else {
+                        let tr = self.tr;
+                        let val = self.trail[tr - 1];
+                        self.trail[i] = val;
+                    },
+                Ref::StackCell(fr, _) => {
+                    let b = self.b - 1;
+                    let fr_gi = self.and_stack[fr].global_index;
+                    let b_gi  = if !self.or_stack.is_empty() {
+                        self.or_stack[b].global_index
+                    } else {
+                        0
+                    };
+
+                    if fr_gi < b_gi {
+                        i += 1;
+                    } else {
+                        let tr = self.tr;
+                        let val = self.trail[tr - 1];
+                        self.trail[i] = val;
+                    }
+                }
+            };
+        }
+    }
+
     fn execute_fact_instr(&mut self, instr: &FactInstruction) {
         match instr {
             &FactInstruction::GetConstant(_, ref constant, reg) => {
@@ -703,12 +773,12 @@ impl MachineState {
 
                 match offset {
                     0 => self.fail = true,
-                    o => self.p += o                    
-                };            
+                    o => self.p += o
+                };
             }
         };
     }
-    
+
     fn execute_query_instr(&mut self, instr: &QueryInstruction) {
         match instr {
             &QueryInstruction::PutConstant(_, ref constant, reg) =>
@@ -821,6 +891,7 @@ impl MachineState {
                     Some(compiled_tl_index) => {
                         self.cp = self.p + 1;
                         self.num_of_args = arity;
+                        self.b0 = self.b;
                         self.p  = CodePtr::DirEntry(compiled_tl_index);
                     },
                     None => self.fail = true
@@ -841,7 +912,8 @@ impl MachineState {
                 match compiled_tl_index {
                     Some(compiled_tl_index) => {
                         self.num_of_args = arity;
-                        self.p = CodePtr::DirEntry(compiled_tl_index);
+                        self.b0 = self.b;
+                        self.p  = CodePtr::DirEntry(compiled_tl_index);
                     },
                     None => self.fail = true
                 };
@@ -865,10 +937,11 @@ impl MachineState {
                                    self.p + 1,
                                    self.tr,
                                    self.h,
+                                   self.b0,
                                    self.num_of_args);
 
-                self.b = self.or_stack.len() - 1;
-                let b = self.b;
+                self.b = self.or_stack.len();
+                let b = self.b - 1;
 
                 for i in 1 .. n + 1 {
                     self.or_stack[b][i] = self.registers[i].clone();
@@ -878,7 +951,7 @@ impl MachineState {
                 self.p += l;
             },
             &IndexedChoiceInstruction::Retry(l) => {
-                let b = self.b;
+                let b = self.b - 1;
                 let n = self.or_stack[b].num_args();
 
                 for i in 1 .. n + 1 {
@@ -905,7 +978,7 @@ impl MachineState {
                 self.p += l;
             },
             &IndexedChoiceInstruction::Trust(l) => {
-                let b = self.b;
+                let b = self.b - 1;
                 let n = self.or_stack[b].num_args();
 
                 for i in 1 .. n + 1 {
@@ -935,10 +1008,10 @@ impl MachineState {
             }
         };
     }
-    
+
     fn execute_choice_instr(&mut self, instr: &ChoiceInstruction)
     {
-        match instr {            
+        match instr {
             &ChoiceInstruction::TryMeElse(offset) => {
                 let n = self.num_of_args;
                 let num_frames = self.num_frames();
@@ -950,10 +1023,11 @@ impl MachineState {
                                    self.p + offset,
                                    self.tr,
                                    self.h,
+                                   self.b0,
                                    self.num_of_args);
 
-                self.b = self.or_stack.len() - 1;
-                let b = self.b;
+                self.b = self.or_stack.len();
+                let b = self.b - 1;
 
                 for i in 1 .. n + 1 {
                     self.or_stack[b][i] = self.registers[i].clone();
@@ -961,9 +1035,9 @@ impl MachineState {
 
                 self.hb = self.h;
                 self.p += 1;
-            },            
+            },
             &ChoiceInstruction::RetryMeElse(offset) => {
-                let b = self.b;
+                let b = self.b - 1;
                 let n = self.or_stack[b].num_args();
 
                 for i in 1 .. n + 1 {
@@ -990,7 +1064,7 @@ impl MachineState {
                 self.p += 1;
             },
             &ChoiceInstruction::TrustMe => {
-                let b = self.b;
+                let b = self.b - 1;
                 let n = self.or_stack[b].num_args();
 
                 for i in 1 .. n + 1 {
@@ -1021,11 +1095,55 @@ impl MachineState {
         }
     }
 
+    fn execute_cut_instr(&mut self, instr: &CutInstruction) {
+        match instr {
+            &CutInstruction::Cut(ref term) => {
+                let b = self.b;
+                let e = self.e;
+                let b0 = self.and_stack[e].b0; // STACK[E+2+1]
+
+                if b > b0 {
+                    self.b = b0;
+                    self.tidy_trail();
+                }
+
+                if let &Terminal::Terminal = term {
+                    self.p = CodePtr::TopLevel;
+                } else {
+                    self.p += 1;
+                }
+            },
+            &CutInstruction::GetLevel => {
+                let b0 = self.b0;
+                let e  = self.e;
+
+                self.and_stack[e].b0 = b0;
+                self.p += 1;
+            },
+            &CutInstruction::NeckCut(ref term) => {
+                let b = self.b;
+                let b0 = self.b0;
+
+                if b > b0 {
+                    self.b = b0;
+                    self.tidy_trail();
+                }
+                
+                if let &Terminal::Terminal = term {
+                    self.p = CodePtr::TopLevel;
+                } else {
+                    self.p += 1;
+                }
+            }
+        }
+    }
+
     fn reset(&mut self) {
         self.h = 0;
         self.hb = 0;
         self.e = 0;
         self.b = 0;
+        self.b0 = 0;
         self.s = 0;
         self.tr = 0;
         self.p = CodePtr::TopLevel;
@@ -1039,5 +1157,5 @@ impl MachineState {
         self.and_stack.clear();
         self.or_stack.clear();
         self.registers = vec![Addr::HeapCell(0); 64];
-    }
+    }    
 }
index 0ebadb2fe8788b8bb7b056defe18ab4031a31196..2f927b188fdfb555bcd6f564ec02cc1de6741d63 100644 (file)
@@ -7,10 +7,11 @@ pub struct Frame {
     pub global_index: usize,
     pub e: usize,
     pub cp: CodePtr,
-    pub b: usize,
+    pub b: usize,    
     pub bp: CodePtr,
     pub tr: usize,
     pub h: usize,
+    pub b0: usize,
     args: Vec<Addr>
 }
 
@@ -22,6 +23,7 @@ impl Frame {
            bp: CodePtr,
            tr: usize,
            h: usize,
+           b0: usize,
            n: usize)
            -> Self
     {
@@ -33,6 +35,7 @@ impl Frame {
             bp: bp,
             tr: tr,
             h: h,
+            b0: b0,
             args: vec![Addr::HeapCell(0); n]
         }
     }
@@ -57,9 +60,10 @@ impl OrStack {
                 bp: CodePtr,
                 tr: usize,
                 h: usize,
+                b0: usize,
                 n: usize)
     {
-        self.0.push(Frame::new(global_index, e, cp, b, bp, tr, h, n));
+        self.0.push(Frame::new(global_index, e, cp, b, bp, tr, h, b0, n));
     }
 
     pub fn len(&self) -> usize {
index 163b28f32d9d558eeea57f1a9e67777c502c091a..fc0d6ffbd30bb2fa3e3e6cf82cfc1be83656cf5e 100644 (file)
@@ -57,19 +57,25 @@ PredicateClause : PredicateClause = {
 };
 
 Rule : Rule = {
-    <c:Clause> ":-" <h:Term> <cs: ("," <Term>)*> =>
+    <c:Clause> ":-" <h:TermOrCut> <cs: ("," <TermOrCut>)*> =>
         Rule { head: (c, h), clauses: cs },
-    <a:Atom> ":-" <h:Term> <cs: ("," <Term>)*> =>
-        Rule { head: (Term::Constant(Cell::default(), Constant::Atom(a)), h),
+    <a:Atom> ":-" <h:TermOrCut> <cs: ("," <TermOrCut>)*> =>
+        Rule { head: (Term::Constant(Cell::default(), Constant::Atom(a)),
+                     h),
                clauses: cs }
 };
 
+TermOrCut : TermOrCut = {
+    "!"    => TermOrCut::Cut,
+    <Term> => TermOrCut::Term(<>)
+};
+
 Term : Term = {
     <Atom>   => Term::Constant(Cell::default(), Constant::Atom(<>)),
     <Clause> => <>,
     <List>   => <>,
     <Var>    => Term::Var(Cell::default(), <>),
-    "_"      => Term::AnonVar
+    "_"      => Term::AnonVar    
 };
 
 Var : Var = {
index 1703c177a20a74921dd718afd156c3ebd9e9d5ff..39cc865c3df44a2739f094f4091b11867f5bd5b9 100644 (file)
@@ -10,6 +10,7 @@ mod __parse__TopLevel {
     extern crate lalrpop_util as __lalrpop_util;
     #[allow(dead_code)]
     pub enum __Symbol<'input> {
+        Term_22_21_22(&'input str),
         Term_22_28_22(&'input str),
         Term_22_29_22(&'input str),
         Term_22_2c_22(&'input str),
@@ -24,9 +25,9 @@ mod __parse__TopLevel {
         Termr_23_22_5bA_2dZ_5d_5bA_2dZa_2dz0_2d9___5d_2a_22_23(&'input str),
         Termr_23_22_5ba_2dz_5d_5bA_2dZa_2dz0_2d9___5d_2a_22_23(&'input str),
         Termerror(__lalrpop_util::ErrorRecovery<usize, (usize, &'input str), ()>),
-        Nt_28_22_2c_22_20_3cTerm_3e_29(Term),
-        Nt_28_22_2c_22_20_3cTerm_3e_29_2a(::std::vec::Vec<Term>),
-        Nt_28_22_2c_22_20_3cTerm_3e_29_2b(::std::vec::Vec<Term>),
+        Nt_28_22_2c_22_20_3cTermOrCut_3e_29(TermOrCut),
+        Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2a(::std::vec::Vec<TermOrCut>),
+        Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(::std::vec::Vec<TermOrCut>),
         Nt_28_3cBoxedTerm_3e_20_22_2c_22_29(Box<Term>),
         Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2a(::std::vec::Vec<Box<Term>>),
         Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2b(::std::vec::Vec<Box<Term>>),
@@ -41,273 +42,278 @@ mod __parse__TopLevel {
         NtPredicateClause(PredicateClause),
         NtRule(Rule),
         NtTerm(Term),
+        NtTermOrCut(TermOrCut),
         NtTopLevel(TopLevel),
         NtVar(Var),
         Nt____TopLevel(TopLevel),
     }
     const __ACTION: &'static [i32] = &[
         // State 0
-        0, 0, 0, 0, 0, 12, 13, 14, 0, 15, 0, 16, 17, 0,
+        0, 0, 0, 0, 0, 0, 12, 13, 14, 0, 15, 0, 16, 17, 0,
         // State 1
-        0, 0, 0, 0, 0, 0, 13, 14, 0, 15, 0, 16, 17, 0,
+        0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 15, 0, 16, 17, 0,
         // State 2
-        21, 0, 0, -30, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 21, 0, 0, -30, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 3
-        0, 0, 0, -31, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -31, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 4
-        0, 0, 0, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 5
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 6
-        0, 0, 0, 0, 0, 0, -12, -12, 0, -12, 0, -12, -12, 0,
+        0, 0, 0, 0, 0, 0, 0, -12, -12, 0, -12, 0, -12, -12, 0,
         // State 7
-        0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 8
-        0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 9
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 10
-        0, 0, 0, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 11
-        0, 0, 0, 0, 0, 0, 13, 14, 0, 15, 0, 16, 29, 0,
+        0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 15, 0, 16, 29, 0,
         // State 12
-        0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
+        0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
         // State 13
-        0, 0, 0, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 14
-        0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 15
-        0, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 16
-        -14, 0, 0, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, -14, 0, 0, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 17
-        0, 0, 0, 0, 0, 0, -13, -13, 0, -13, 0, -13, -13, 0,
+        0, 0, 0, 0, 0, 0, 0, -13, -13, 0, -13, 0, -13, -13, 0,
         // State 18
-        0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 19
-        0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 20
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 21
-        0, 0, 0, 0, 0, 0, 61, 62, 0, 63, 0, 64, 65, 0,
+        62, 0, 0, 0, 0, 0, 0, 63, 64, 0, 65, 0, 66, 67, 0,
         // State 22
-        0, 0, 0, 0, 0, 0, 61, 62, 0, 63, 0, 64, 65, 0,
+        62, 0, 0, 0, 0, 0, 0, 63, 64, 0, 65, 0, 66, 67, 0,
         // State 23
-        0, 0, 0, 0, 0, 0, -24, -24, 0, -24, 0, -24, -24, 0,
+        0, 0, 0, 0, 0, 0, 0, -24, -24, 0, -24, 0, -24, -24, 0,
         // State 24
-        0, 0, 0, 0, 0, 0, -25, -25, 0, -25, 0, -25, -25, 0,
+        0, 0, 0, 0, 0, 0, 0, -25, -25, 0, -25, 0, -25, -25, 0,
         // State 25
-        67, 0, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 69, 0, 0, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 26
-        0, 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 27
-        0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 28
-        -14, 0, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, -14, 0, 0, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 29
-        69, 0, -30, 0, 0, 0, 0, 0, -30, 0, -30, 0, 0, 0,
+        0, 71, 0, -30, 0, 0, 0, 0, 0, -30, 0, -30, 0, 0, 0,
         // State 30
-        0, 0, 70, 0, 0, 0, 0, 0, -20, 0, 71, 0, 0, 0,
+        0, 0, 0, 72, 0, 0, 0, 0, 0, -20, 0, 73, 0, 0, 0,
         // State 31
-        0, 0, -31, 0, 0, 0, 0, 0, -31, 0, -31, 0, 0, 0,
+        0, 0, 0, -31, 0, 0, 0, 0, 0, -31, 0, -31, 0, 0, 0,
         // State 32
-        0, 0, -32, 0, 0, 0, 0, 0, -32, 0, -32, 0, 0, 0,
+        0, 0, 0, -32, 0, 0, 0, 0, 0, -32, 0, -32, 0, 0, 0,
         // State 33
-        0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 0, 0,
         // State 34
-        0, 0, -15, 0, 0, 0, 0, 0, -15, 0, -15, 0, 0, 0,
+        0, 0, 0, -15, 0, 0, 0, 0, 0, -15, 0, -15, 0, 0, 0,
         // State 35
-        0, 0, -33, 0, 0, 0, 0, 0, -33, 0, -33, 0, 0, 0,
+        0, 0, 0, -33, 0, 0, 0, 0, 0, -33, 0, -33, 0, 0, 0,
         // State 36
-        0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
+        0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
         // State 37
-        0, 0, -18, 0, 0, 0, 0, 0, -18, 0, -18, 0, 0, 0,
+        0, 0, 0, -18, 0, 0, 0, 0, 0, -18, 0, -18, 0, 0, 0,
         // State 38
-        0, 0, -34, 0, 0, 0, 0, 0, -34, 0, -34, 0, 0, 0,
+        0, 0, 0, -34, 0, 0, 0, 0, 0, -34, 0, -34, 0, 0, 0,
         // State 39
-        0, 0, -39, 0, 0, 0, 0, 0, -39, 0, -39, 0, 0, 0,
+        0, 0, 0, -41, 0, 0, 0, 0, 0, -41, 0, -41, 0, 0, 0,
         // State 40
-        -14, 0, -14, 0, 0, 0, 0, 0, -14, 0, -14, 0, 0, 0,
+        0, -14, 0, -14, 0, 0, 0, 0, 0, -14, 0, -14, 0, 0, 0,
         // State 41
-        0, 0, 0, 0, 0, 0, -24, -24, 0, -24, 0, -24, -24, 0,
+        0, 0, 0, 0, 0, 0, 0, -24, -24, 0, -24, 0, -24, -24, 0,
         // State 42
-        0, 0, 0, 0, 0, 0, -25, -25, 0, -25, 0, -25, -25, 0,
+        0, 0, 0, 0, 0, 0, 0, -25, -25, 0, -25, 0, -25, -25, 0,
         // State 43
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 44
-        75, -30, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 77, -30, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 45
-        0, 76, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 46
-        0, -31, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -31, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 47
-        0, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 48
-        0, -15, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -15, -15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 49
-        0, -33, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -33, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 50
-        0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
+        0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
         // State 51
-        0, -18, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -18, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 52
-        0, -34, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -34, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 53
-        0, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 54
-        -14, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, -14, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 55
-        79, 0, -30, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 81, 0, -30, -30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 56
-        0, 0, -31, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -31, -31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 57
-        0, 0, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 58
-        0, 0, 81, -28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -36, -36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 59
-        0, 0, -33, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 83, -28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 60
-        0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
+        0, 0, 0, -33, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 61
-        0, 0, -18, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -35, -35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 62
-        0, 0, -34, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
         // State 63
-        0, 0, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -18, -18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 64
-        -14, 0, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -34, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 65
-        0, 0, 81, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -41, -41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 66
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, -14, 0, -14, -14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 67
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 83, -26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 68
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 69
-        0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 70
-        0, 0, 0, 0, 0, 0, 95, 96, 0, 97, 0, 98, 99, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 71
-        0, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
         // State 72
-        0, 0, 0, 0, 0, 0, 0, 0, 100, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 97, 98, 0, 99, 0, 100, 101, 0,
         // State 73
-        0, 101, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 74
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0,
         // State 75
-        0, 0, 0, -16, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 103, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 76
-        0, 0, 0, 0, 0, 0, -9, -9, 0, -9, 0, -9, -9, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 77
-        0, 0, 0, 0, 0, 0, 0, 0, 105, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, -16, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 78
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, 0, 0, 0, -9, -9, 0, -9, 0, -9, -9, 0,
         // State 79
-        0, 0, 108, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, 0, 0, 0,
         // State 80
-        0, 0, 0, 0, 0, 0, 61, 62, 0, 63, 0, 64, 65, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 81
-        0, 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, 0, 0, 0,
+        0, 0, 0, 110, -29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 82
-        0, 0, 108, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        62, 0, 0, 0, 0, 0, 0, 63, 64, 0, 65, 0, 66, 67, 0,
         // State 83
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0,
         // State 84
-        0, 112, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 110, -27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 85
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 86
-        0, 114, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 114, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 87
-        0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 88
-        115, 0, 0, 0, 0, 0, 0, 0, -30, 0, 0, 0, 0, 0,
+        0, 0, 116, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 89
-        0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -21, 0, 0, 0, 0, 0,
         // State 90
-        0, 0, 0, 0, 0, 0, 0, 0, -31, 0, 0, 0, 0, 0,
+        0, 117, 0, 0, 0, 0, 0, 0, 0, -30, 0, 0, 0, 0, 0,
         // State 91
-        0, 0, 0, 0, 0, 0, 0, 0, -32, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -22, 0, 0, 0, 0, 0,
         // State 92
-        0, 0, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 0, 0, 0, 0, 0,
         // State 93
-        0, 0, 0, 0, 0, 0, 0, 0, -33, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -32, 0, 0, 0, 0, 0,
         // State 94
-        0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -15, 0, 0, 0, 0, 0,
         // State 95
-        0, 0, 0, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -33, 0, 0, 0, 0, 0,
         // State 96
-        0, 0, 0, 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 37, 38, 0, 39, 0, 40, 41, 0,
         // State 97
-        0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -18, 0, 0, 0, 0, 0,
         // State 98
-        -14, 0, 0, 0, 0, 0, 0, 0, -14, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0,
         // State 99
-        0, 0, -19, 0, 0, 0, 0, 0, -19, 0, -19, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -41, 0, 0, 0, 0, 0,
         // State 100
-        0, 0, 0, -17, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, -14, 0, 0, 0, 0, 0, 0, 0, -14, 0, 0, 0, 0, 0,
         // State 101
-        0, 0, 0, 0, 0, 0, -10, -10, 0, -10, 0, -10, -10, 0,
+        0, 0, 0, -19, 0, 0, 0, 0, 0, -19, 0, -19, 0, 0, 0,
         // State 102
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, -17, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 103
-        0, 118, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, -10, -10, 0, -10, 0, -10, -10, 0,
         // State 104
-        0, -19, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 105
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 120, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 106
-        0, 120, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -19, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 107
-        0, 0, 0, 0, 0, 0, 61, 62, 0, 63, 0, 64, 65, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 108
-        0, 0, -4, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 122, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 109
-        0, 0, -19, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        62, 0, 0, 0, 0, 0, 0, 63, 64, 0, 65, 0, 66, 67, 0,
         // State 110
-        0, 122, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -4, -4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 111
-        0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -19, -19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 112
-        0, 123, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 124, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 113
-        0, 0, -16, 0, 0, 0, 0, 0, -16, 0, -16, 0, 0, 0,
+        0, 0, 0, 0, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 114
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 125, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 115
-        0, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0,
+        0, 0, 0, -16, 0, 0, 0, 0, 0, -16, 0, -16, 0, 0, 0,
         // State 116
-        0, 127, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 117
-        0, -16, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0,
         // State 118
-        0, 128, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 129, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 119
-        0, 0, -16, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -16, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 120
-        0, 0, -5, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 130, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 121
-        0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -16, -16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 122
-        0, 0, -17, 0, 0, 0, 0, 0, -17, 0, -17, 0, 0, 0,
+        0, 0, 0, -5, -5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 123
-        0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
+        0, 0, 0, 0, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 124
-        0, 130, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, -17, 0, 0, 0, 0, 0, -17, 0, -17, 0, 0, 0,
         // State 125
-        0, 0, 0, 0, 0, 0, 0, 0, -19, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 51, 52, 0, 53, 0, 54, 55, 0,
         // State 126
-        0, -17, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 132, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 127
-        0, 0, -17, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -19, 0, 0, 0, 0, 0,
         // State 128
-        0, 131, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, -17, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 129
-        0, 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0,
+        0, 0, 0, -17, -17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 130
-        0, 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0,
+        0, 0, 133, 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 131
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -16, 0, 0, 0, 0, 0,
+        // State 132
+        0, 0, 0, 0, 0, 0, 0, 0, 0, -17, 0, 0, 0, 0, 0,
     ];
     const __EOF_ACTION: &'static [i32] = &[
         0,
@@ -315,11 +321,11 @@ mod __parse__TopLevel {
         0,
         0,
         0,
-        -36,
+        -38,
         0,
         0,
         0,
-        -40,
+        -42,
         0,
         0,
         0,
@@ -333,8 +339,8 @@ mod __parse__TopLevel {
         0,
         0,
         0,
-        -37,
-        -38,
+        -39,
+        -40,
         0,
         0,
         0,
@@ -377,7 +383,9 @@ mod __parse__TopLevel {
         0,
         0,
         0,
-        -35,
+        0,
+        0,
+        -37,
         0,
         0,
         0,
@@ -444,270 +452,275 @@ mod __parse__TopLevel {
     ];
     const __GOTO: &'static [i32] = &[
         // State 0
-        0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 5, 0, 6, 7, 8, 9, 10, 11, 0,
+        0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 4, 5, 0, 6, 7, 8, 9, 0, 10, 11, 0,
         // State 1
-        0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 5, 0, 0, 18, 19, 20, 0, 11, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 5, 0, 0, 18, 19, 20, 0, 0, 11, 0,
         // State 2
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 3
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 4
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 5
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 6
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 7
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 8
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 9
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 10
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 11
-        0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 27, 5, 0, 0, 0, 0, 28, 0, 11, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 27, 5, 0, 0, 0, 0, 28, 0, 0, 11, 0,
         // State 12
-        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 34, 0, 0, 0, 35, 0, 36, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 34, 0, 0, 0, 35, 0, 0, 36, 0,
         // State 13
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 14
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 15
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 16
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 17
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 18
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 19
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 20
-        0, 0, 0, 0, 0, 44, 0, 0, 45, 46, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 44, 0, 0, 45, 46, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 21
-        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 59, 0, 60, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 59, 60, 0, 61, 0,
         // State 22
-        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 66, 0, 60, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 59, 68, 0, 61, 0,
         // State 23
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 24
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 25
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 26
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 27
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 28
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 29
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 30
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 31
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 32
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 33
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 34
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 35
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 36
-        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 73, 0, 0, 0, 35, 0, 36, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 75, 0, 0, 0, 35, 0, 0, 36, 0,
         // State 37
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 38
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 39
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 40
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 41
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 42
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 43
-        0, 0, 0, 0, 0, 0, 0, 0, 45, 74, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 45, 76, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 44
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 45
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 46
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 47
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 48
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 49
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 50
-        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 78, 0, 0, 0, 35, 0, 36, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 80, 0, 0, 0, 35, 0, 0, 36, 0,
         // State 51
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 52
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 53
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 54
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 55
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 56
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 57
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 58
-        0, 0, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 59
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 60
-        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 82, 0, 0, 0, 35, 0, 36, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 61
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 62
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 84, 0, 0, 0, 35, 0, 0, 36, 0,
         // State 63
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 64
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 65
-        0, 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 66
-        0, 0, 0, 0, 0, 84, 0, 0, 45, 85, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 67
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 68
-        0, 0, 0, 0, 0, 86, 0, 0, 45, 87, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 86, 0, 0, 45, 87, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 69
-        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 88, 0, 0, 0, 35, 0, 36, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 70
-        0, 0, 0, 0, 0, 0, 0, 0, 89, 90, 91, 92, 0, 0, 0, 0, 93, 0, 94, 0,
+        0, 0, 0, 0, 0, 88, 0, 0, 45, 89, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 71
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 90, 0, 0, 0, 35, 0, 0, 36, 0,
         // State 72
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 91, 92, 93, 94, 0, 0, 0, 0, 95, 0, 0, 96, 0,
         // State 73
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 74
-        0, 0, 0, 0, 0, 103, 0, 0, 45, 104, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 75
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 76
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 105, 0, 0, 45, 106, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 77
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 78
-        0, 0, 0, 0, 0, 106, 0, 0, 45, 107, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 79
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 80
-        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 109, 0, 60, 0,
+        0, 0, 0, 0, 0, 108, 0, 0, 45, 109, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 81
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 82
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 59, 111, 0, 61, 0,
         // State 83
-        0, 0, 0, 0, 0, 0, 0, 0, 45, 111, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 84
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 85
-        0, 0, 0, 0, 0, 0, 0, 0, 45, 113, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 45, 113, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 86
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 87
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 45, 115, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 88
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 89
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 90
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 91
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 92
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 93
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 94
-        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 116, 0, 0, 0, 35, 0, 36, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 95
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 96
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, 118, 0, 0, 0, 35, 0, 0, 36, 0,
         // State 97
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 98
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 99
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 100
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 101
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 102
-        0, 0, 0, 0, 0, 0, 0, 0, 45, 117, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 103
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 104
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 45, 119, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 105
-        0, 0, 0, 0, 0, 0, 0, 0, 45, 119, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 106
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 107
-        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 121, 0, 60, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 45, 121, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 108
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 109
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 58, 0, 0, 0, 0, 59, 123, 0, 61, 0,
         // State 110
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 111
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 112
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 113
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 114
-        0, 0, 0, 0, 0, 124, 0, 0, 45, 125, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 115
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 116
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 126, 0, 0, 45, 127, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 117
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 118
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 119
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 120
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 121
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 122
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 123
-        0, 0, 0, 0, 0, 0, 0, 0, 45, 129, 47, 48, 0, 0, 0, 0, 49, 0, 50, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 124
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 125
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 45, 131, 47, 48, 0, 0, 0, 0, 49, 0, 0, 50, 0,
         // State 126
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 127
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 128
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 129
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         // State 130
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 131
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 132
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
     ];
     fn __expected_tokens(__state: usize) -> Vec<::std::string::String> {
         const __TERMINAL: &'static [&'static str] = &[
+            r###""!""###,
             r###""(""###,
             r###"")""###,
             r###"",""###,
@@ -722,7 +735,7 @@ mod __parse__TopLevel {
             r###"r#"[A-Z][A-Za-z0-9_]*"#"###,
             r###"r#"[a-z][A-Za-z0-9_]*"#"###,
         ];
-        __ACTION[(__state * 14)..].iter().zip(__TERMINAL).filter_map(|(&state, terminal)| {
+        __ACTION[(__state * 15)..].iter().zip(__TERMINAL).filter_map(|(&state, terminal)| {
             if state == 0 {
                 None
             } else {
@@ -763,6 +776,7 @@ mod __parse__TopLevel {
                 (10, _) if true => 10,
                 (11, _) if true => 11,
                 (12, _) if true => 12,
+                (13, _) if true => 13,
                 _ => {
                     let __state = *__states.last().unwrap() as usize;
                     let __error = __lalrpop_util::ParseError::UnrecognizedToken {
@@ -774,59 +788,63 @@ mod __parse__TopLevel {
             };
             '__inner: loop {
                 let __state = *__states.last().unwrap() as usize;
-                let __action = __ACTION[__state * 14 + __integer];
+                let __action = __ACTION[__state * 15 + __integer];
                 if __action > 0 {
                     let __symbol = match __integer {
                         0 => match __lookahead.1 {
-                            (0, __tok0) => __Symbol::Term_22_28_22(__tok0),
+                            (0, __tok0) => __Symbol::Term_22_21_22(__tok0),
                             _ => unreachable!(),
                         },
                         1 => match __lookahead.1 {
-                            (1, __tok0) => __Symbol::Term_22_29_22(__tok0),
+                            (1, __tok0) => __Symbol::Term_22_28_22(__tok0),
                             _ => unreachable!(),
                         },
                         2 => match __lookahead.1 {
-                            (2, __tok0) => __Symbol::Term_22_2c_22(__tok0),
+                            (2, __tok0) => __Symbol::Term_22_29_22(__tok0),
                             _ => unreachable!(),
                         },
                         3 => match __lookahead.1 {
-                            (3, __tok0) => __Symbol::Term_22_2e_22(__tok0),
+                            (3, __tok0) => __Symbol::Term_22_2c_22(__tok0),
                             _ => unreachable!(),
                         },
                         4 => match __lookahead.1 {
-                            (4, __tok0) => __Symbol::Term_22_3a_2d_22(__tok0),
+                            (4, __tok0) => __Symbol::Term_22_2e_22(__tok0),
                             _ => unreachable!(),
                         },
                         5 => match __lookahead.1 {
-                            (5, __tok0) => __Symbol::Term_22_3f_2d_22(__tok0),
+                            (5, __tok0) => __Symbol::Term_22_3a_2d_22(__tok0),
                             _ => unreachable!(),
                         },
                         6 => match __lookahead.1 {
-                            (6, __tok0) => __Symbol::Term_22_5b_22(__tok0),
+                            (6, __tok0) => __Symbol::Term_22_3f_2d_22(__tok0),
                             _ => unreachable!(),
                         },
                         7 => match __lookahead.1 {
-                            (7, __tok0) => __Symbol::Term_22_5b_5d_22(__tok0),
+                            (7, __tok0) => __Symbol::Term_22_5b_22(__tok0),
                             _ => unreachable!(),
                         },
                         8 => match __lookahead.1 {
-                            (8, __tok0) => __Symbol::Term_22_5d_22(__tok0),
+                            (8, __tok0) => __Symbol::Term_22_5b_5d_22(__tok0),
                             _ => unreachable!(),
                         },
                         9 => match __lookahead.1 {
-                            (9, __tok0) => __Symbol::Term_22___22(__tok0),
+                            (9, __tok0) => __Symbol::Term_22_5d_22(__tok0),
                             _ => unreachable!(),
                         },
                         10 => match __lookahead.1 {
-                            (10, __tok0) => __Symbol::Term_22_7c_22(__tok0),
+                            (10, __tok0) => __Symbol::Term_22___22(__tok0),
                             _ => unreachable!(),
                         },
                         11 => match __lookahead.1 {
-                            (11, __tok0) => __Symbol::Termr_23_22_5bA_2dZ_5d_5bA_2dZa_2dz0_2d9___5d_2a_22_23(__tok0),
+                            (11, __tok0) => __Symbol::Term_22_7c_22(__tok0),
                             _ => unreachable!(),
                         },
                         12 => match __lookahead.1 {
-                            (12, __tok0) => __Symbol::Termr_23_22_5ba_2dz_5d_5bA_2dZa_2dz0_2d9___5d_2a_22_23(__tok0),
+                            (12, __tok0) => __Symbol::Termr_23_22_5bA_2dZ_5d_5bA_2dZa_2dz0_2d9___5d_2a_22_23(__tok0),
+                            _ => unreachable!(),
+                        },
+                        13 => match __lookahead.1 {
+                            (13, __tok0) => __Symbol::Termr_23_22_5ba_2dz_5d_5bA_2dZa_2dz0_2d9___5d_2a_22_23(__tok0),
                             _ => unreachable!(),
                         },
                         _ => unreachable!(),
@@ -878,150 +896,150 @@ mod __parse__TopLevel {
     {
         let __nonterminal = match -__action {
             1 => {
-                // ("," <Term>) = ",", Term => ActionFn(26);
-                let __sym1 = __pop_NtTerm(__symbols);
+                // ("," <TermOrCut>) = ",", TermOrCut => ActionFn(28);
+                let __sym1 = __pop_NtTermOrCut(__symbols);
                 let __sym0 = __pop_Term_22_2c_22(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym1.2.clone();
-                let __nt = super::__action26::<>(input, __sym0, __sym1);
+                let __nt = super::__action28::<>(input, __sym0, __sym1);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 2);
-                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29(__nt), __end));
+                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29(__nt), __end));
                 0
             }
             2 => {
-                // ("," <Term>)* =  => ActionFn(24);
+                // ("," <TermOrCut>)* =  => ActionFn(26);
                 let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
                 let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
-                let __nt = super::__action24::<>(input, &__start, &__end);
+                let __nt = super::__action26::<>(input, &__start, &__end);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 0);
-                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29_2a(__nt), __end));
+                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2a(__nt), __end));
                 1
             }
             3 => {
-                // ("," <Term>)* = ("," <Term>)+ => ActionFn(25);
-                let __sym0 = __pop_Nt_28_22_2c_22_20_3cTerm_3e_29_2b(__symbols);
+                // ("," <TermOrCut>)* = ("," <TermOrCut>)+ => ActionFn(27);
+                let __sym0 = __pop_Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action25::<>(input, __sym0);
+                let __nt = super::__action27::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
-                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29_2a(__nt), __end));
+                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2a(__nt), __end));
                 1
             }
             4 => {
-                // ("," <Term>)+ = ",", Term => ActionFn(37);
-                let __sym1 = __pop_NtTerm(__symbols);
+                // ("," <TermOrCut>)+ = ",", TermOrCut => ActionFn(39);
+                let __sym1 = __pop_NtTermOrCut(__symbols);
                 let __sym0 = __pop_Term_22_2c_22(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym1.2.clone();
-                let __nt = super::__action37::<>(input, __sym0, __sym1);
+                let __nt = super::__action39::<>(input, __sym0, __sym1);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 2);
-                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29_2b(__nt), __end));
+                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(__nt), __end));
                 2
             }
             5 => {
-                // ("," <Term>)+ = ("," <Term>)+, ",", Term => ActionFn(38);
-                let __sym2 = __pop_NtTerm(__symbols);
+                // ("," <TermOrCut>)+ = ("," <TermOrCut>)+, ",", TermOrCut => ActionFn(40);
+                let __sym2 = __pop_NtTermOrCut(__symbols);
                 let __sym1 = __pop_Term_22_2c_22(__symbols);
-                let __sym0 = __pop_Nt_28_22_2c_22_20_3cTerm_3e_29_2b(__symbols);
+                let __sym0 = __pop_Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym2.2.clone();
-                let __nt = super::__action38::<>(input, __sym0, __sym1, __sym2);
+                let __nt = super::__action40::<>(input, __sym0, __sym1, __sym2);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 3);
-                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29_2b(__nt), __end));
+                __symbols.push((__start, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(__nt), __end));
                 2
             }
             6 => {
-                // (<BoxedTerm> ",") = BoxedTerm, "," => ActionFn(32);
+                // (<BoxedTerm> ",") = BoxedTerm, "," => ActionFn(34);
                 let __sym1 = __pop_Term_22_2c_22(__symbols);
                 let __sym0 = __pop_NtBoxedTerm(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym1.2.clone();
-                let __nt = super::__action32::<>(input, __sym0, __sym1);
+                let __nt = super::__action34::<>(input, __sym0, __sym1);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 2);
                 __symbols.push((__start, __Symbol::Nt_28_3cBoxedTerm_3e_20_22_2c_22_29(__nt), __end));
                 3
             }
             7 => {
-                // (<BoxedTerm> ",")* =  => ActionFn(30);
+                // (<BoxedTerm> ",")* =  => ActionFn(32);
                 let __start = __symbols.last().map(|s| s.2.clone()).unwrap_or_default();
                 let __end = __lookahead_start.cloned().unwrap_or_else(|| __start.clone());
-                let __nt = super::__action30::<>(input, &__start, &__end);
+                let __nt = super::__action32::<>(input, &__start, &__end);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 0);
                 __symbols.push((__start, __Symbol::Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2a(__nt), __end));
                 4
             }
             8 => {
-                // (<BoxedTerm> ",")* = (<BoxedTerm> ",")+ => ActionFn(31);
+                // (<BoxedTerm> ",")* = (<BoxedTerm> ",")+ => ActionFn(33);
                 let __sym0 = __pop_Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2b(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action31::<>(input, __sym0);
+                let __nt = super::__action33::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2a(__nt), __end));
                 4
             }
             9 => {
-                // (<BoxedTerm> ",")+ = BoxedTerm, "," => ActionFn(43);
+                // (<BoxedTerm> ",")+ = BoxedTerm, "," => ActionFn(45);
                 let __sym1 = __pop_Term_22_2c_22(__symbols);
                 let __sym0 = __pop_NtBoxedTerm(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym1.2.clone();
-                let __nt = super::__action43::<>(input, __sym0, __sym1);
+                let __nt = super::__action45::<>(input, __sym0, __sym1);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 2);
                 __symbols.push((__start, __Symbol::Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2b(__nt), __end));
                 5
             }
             10 => {
-                // (<BoxedTerm> ",")+ = (<BoxedTerm> ",")+, BoxedTerm, "," => ActionFn(44);
+                // (<BoxedTerm> ",")+ = (<BoxedTerm> ",")+, BoxedTerm, "," => ActionFn(46);
                 let __sym2 = __pop_Term_22_2c_22(__symbols);
                 let __sym1 = __pop_NtBoxedTerm(__symbols);
                 let __sym0 = __pop_Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2b(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym2.2.clone();
-                let __nt = super::__action44::<>(input, __sym0, __sym1, __sym2);
+                let __nt = super::__action46::<>(input, __sym0, __sym1, __sym2);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 3);
                 __symbols.push((__start, __Symbol::Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2b(__nt), __end));
                 5
             }
             11 => {
-                // (<PredicateClause>) = PredicateClause => ActionFn(29);
+                // (<PredicateClause>) = PredicateClause => ActionFn(31);
                 let __sym0 = __pop_NtPredicateClause(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action29::<>(input, __sym0);
+                let __nt = super::__action31::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::Nt_28_3cPredicateClause_3e_29(__nt), __end));
                 6
             }
             12 => {
-                // (<PredicateClause>)+ = PredicateClause => ActionFn(47);
+                // (<PredicateClause>)+ = PredicateClause => ActionFn(49);
                 let __sym0 = __pop_NtPredicateClause(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action47::<>(input, __sym0);
+                let __nt = super::__action49::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::Nt_28_3cPredicateClause_3e_29_2b(__nt), __end));
                 7
             }
             13 => {
-                // (<PredicateClause>)+ = (<PredicateClause>)+, PredicateClause => ActionFn(48);
+                // (<PredicateClause>)+ = (<PredicateClause>)+, PredicateClause => ActionFn(50);
                 let __sym1 = __pop_NtPredicateClause(__symbols);
                 let __sym0 = __pop_Nt_28_3cPredicateClause_3e_29_2b(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym1.2.clone();
-                let __nt = super::__action48::<>(input, __sym0, __sym1);
+                let __nt = super::__action50::<>(input, __sym0, __sym1);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 2);
                 __symbols.push((__start, __Symbol::Nt_28_3cPredicateClause_3e_29_2b(__nt), __end));
@@ -1050,21 +1068,21 @@ mod __parse__TopLevel {
                 9
             }
             16 => {
-                // Clause = Atom, "(", BoxedTerm, ")" => ActionFn(45);
+                // Clause = Atom, "(", BoxedTerm, ")" => ActionFn(47);
                 let __sym3 = __pop_Term_22_29_22(__symbols);
                 let __sym2 = __pop_NtBoxedTerm(__symbols);
                 let __sym1 = __pop_Term_22_28_22(__symbols);
                 let __sym0 = __pop_NtAtom(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym3.2.clone();
-                let __nt = super::__action45::<>(input, __sym0, __sym1, __sym2, __sym3);
+                let __nt = super::__action47::<>(input, __sym0, __sym1, __sym2, __sym3);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 4);
                 __symbols.push((__start, __Symbol::NtClause(__nt), __end));
                 10
             }
             17 => {
-                // Clause = Atom, "(", (<BoxedTerm> ",")+, BoxedTerm, ")" => ActionFn(46);
+                // Clause = Atom, "(", (<BoxedTerm> ",")+, BoxedTerm, ")" => ActionFn(48);
                 let __sym4 = __pop_Term_22_29_22(__symbols);
                 let __sym3 = __pop_NtBoxedTerm(__symbols);
                 let __sym2 = __pop_Nt_28_3cBoxedTerm_3e_20_22_2c_22_29_2b(__symbols);
@@ -1072,7 +1090,7 @@ mod __parse__TopLevel {
                 let __sym0 = __pop_NtAtom(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym4.2.clone();
-                let __nt = super::__action46::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+                let __nt = super::__action48::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 5);
                 __symbols.push((__start, __Symbol::NtClause(__nt), __end));
@@ -1176,115 +1194,137 @@ mod __parse__TopLevel {
                 14
             }
             26 => {
-                // Rule = Clause, ":-", Term => ActionFn(39);
-                let __sym2 = __pop_NtTerm(__symbols);
+                // Rule = Clause, ":-", TermOrCut => ActionFn(41);
+                let __sym2 = __pop_NtTermOrCut(__symbols);
                 let __sym1 = __pop_Term_22_3a_2d_22(__symbols);
                 let __sym0 = __pop_NtClause(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym2.2.clone();
-                let __nt = super::__action39::<>(input, __sym0, __sym1, __sym2);
+                let __nt = super::__action41::<>(input, __sym0, __sym1, __sym2);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 3);
                 __symbols.push((__start, __Symbol::NtRule(__nt), __end));
                 15
             }
             27 => {
-                // Rule = Clause, ":-", Term, ("," <Term>)+ => ActionFn(40);
-                let __sym3 = __pop_Nt_28_22_2c_22_20_3cTerm_3e_29_2b(__symbols);
-                let __sym2 = __pop_NtTerm(__symbols);
+                // Rule = Clause, ":-", TermOrCut, ("," <TermOrCut>)+ => ActionFn(42);
+                let __sym3 = __pop_Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(__symbols);
+                let __sym2 = __pop_NtTermOrCut(__symbols);
                 let __sym1 = __pop_Term_22_3a_2d_22(__symbols);
                 let __sym0 = __pop_NtClause(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym3.2.clone();
-                let __nt = super::__action40::<>(input, __sym0, __sym1, __sym2, __sym3);
+                let __nt = super::__action42::<>(input, __sym0, __sym1, __sym2, __sym3);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 4);
                 __symbols.push((__start, __Symbol::NtRule(__nt), __end));
                 15
             }
             28 => {
-                // Rule = Atom, ":-", Term => ActionFn(41);
-                let __sym2 = __pop_NtTerm(__symbols);
+                // Rule = Atom, ":-", TermOrCut => ActionFn(43);
+                let __sym2 = __pop_NtTermOrCut(__symbols);
                 let __sym1 = __pop_Term_22_3a_2d_22(__symbols);
                 let __sym0 = __pop_NtAtom(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym2.2.clone();
-                let __nt = super::__action41::<>(input, __sym0, __sym1, __sym2);
+                let __nt = super::__action43::<>(input, __sym0, __sym1, __sym2);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 3);
                 __symbols.push((__start, __Symbol::NtRule(__nt), __end));
                 15
             }
             29 => {
-                // Rule = Atom, ":-", Term, ("," <Term>)+ => ActionFn(42);
-                let __sym3 = __pop_Nt_28_22_2c_22_20_3cTerm_3e_29_2b(__symbols);
-                let __sym2 = __pop_NtTerm(__symbols);
+                // Rule = Atom, ":-", TermOrCut, ("," <TermOrCut>)+ => ActionFn(44);
+                let __sym3 = __pop_Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(__symbols);
+                let __sym2 = __pop_NtTermOrCut(__symbols);
                 let __sym1 = __pop_Term_22_3a_2d_22(__symbols);
                 let __sym0 = __pop_NtAtom(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym3.2.clone();
-                let __nt = super::__action42::<>(input, __sym0, __sym1, __sym2, __sym3);
+                let __nt = super::__action44::<>(input, __sym0, __sym1, __sym2, __sym3);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 4);
                 __symbols.push((__start, __Symbol::NtRule(__nt), __end));
                 15
             }
             30 => {
-                // Term = Atom => ActionFn(18);
+                // Term = Atom => ActionFn(20);
                 let __sym0 = __pop_NtAtom(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action18::<>(input, __sym0);
+                let __nt = super::__action20::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::NtTerm(__nt), __end));
                 16
             }
             31 => {
-                // Term = Clause => ActionFn(19);
+                // Term = Clause => ActionFn(21);
                 let __sym0 = __pop_NtClause(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action19::<>(input, __sym0);
+                let __nt = super::__action21::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::NtTerm(__nt), __end));
                 16
             }
             32 => {
-                // Term = List => ActionFn(20);
+                // Term = List => ActionFn(22);
                 let __sym0 = __pop_NtList(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action20::<>(input, __sym0);
+                let __nt = super::__action22::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::NtTerm(__nt), __end));
                 16
             }
             33 => {
-                // Term = Var => ActionFn(21);
+                // Term = Var => ActionFn(23);
                 let __sym0 = __pop_NtVar(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action21::<>(input, __sym0);
+                let __nt = super::__action23::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::NtTerm(__nt), __end));
                 16
             }
             34 => {
-                // Term = "_" => ActionFn(22);
+                // Term = "_" => ActionFn(24);
                 let __sym0 = __pop_Term_22___22(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action22::<>(input, __sym0);
+                let __nt = super::__action24::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::NtTerm(__nt), __end));
                 16
             }
             35 => {
+                // TermOrCut = "!" => ActionFn(18);
+                let __sym0 = __pop_Term_22_21_22(__symbols);
+                let __start = __sym0.0.clone();
+                let __end = __sym0.2.clone();
+                let __nt = super::__action18::<>(input, __sym0);
+                let __states_len = __states.len();
+                __states.truncate(__states_len - 1);
+                __symbols.push((__start, __Symbol::NtTermOrCut(__nt), __end));
+                17
+            }
+            36 => {
+                // TermOrCut = Term => ActionFn(19);
+                let __sym0 = __pop_NtTerm(__symbols);
+                let __start = __sym0.0.clone();
+                let __end = __sym0.2.clone();
+                let __nt = super::__action19::<>(input, __sym0);
+                let __states_len = __states.len();
+                __states.truncate(__states_len - 1);
+                __symbols.push((__start, __Symbol::NtTermOrCut(__nt), __end));
+                17
+            }
+            37 => {
                 // TopLevel = "?-", Term, "." => ActionFn(1);
                 let __sym2 = __pop_Term_22_2e_22(__symbols);
                 let __sym1 = __pop_NtTerm(__symbols);
@@ -1295,9 +1335,9 @@ mod __parse__TopLevel {
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 3);
                 __symbols.push((__start, __Symbol::NtTopLevel(__nt), __end));
-                17
+                18
             }
-            36 => {
+            38 => {
                 // TopLevel = Predicate => ActionFn(2);
                 let __sym0 = __pop_NtPredicate(__symbols);
                 let __start = __sym0.0.clone();
@@ -1306,9 +1346,9 @@ mod __parse__TopLevel {
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::NtTopLevel(__nt), __end));
-                17
+                18
             }
-            37 => {
+            39 => {
                 // TopLevel = Rule, "." => ActionFn(3);
                 let __sym1 = __pop_Term_22_2e_22(__symbols);
                 let __sym0 = __pop_NtRule(__symbols);
@@ -1318,9 +1358,9 @@ mod __parse__TopLevel {
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 2);
                 __symbols.push((__start, __Symbol::NtTopLevel(__nt), __end));
-                17
+                18
             }
-            38 => {
+            40 => {
                 // TopLevel = Term, "." => ActionFn(4);
                 let __sym1 = __pop_Term_22_2e_22(__symbols);
                 let __sym0 = __pop_NtTerm(__symbols);
@@ -1330,20 +1370,20 @@ mod __parse__TopLevel {
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 2);
                 __symbols.push((__start, __Symbol::NtTopLevel(__nt), __end));
-                17
+                18
             }
-            39 => {
-                // Var = r#"[A-Z][A-Za-z0-9_]*"# => ActionFn(23);
+            41 => {
+                // Var = r#"[A-Z][A-Za-z0-9_]*"# => ActionFn(25);
                 let __sym0 = __pop_Termr_23_22_5bA_2dZ_5d_5bA_2dZa_2dz0_2d9___5d_2a_22_23(__symbols);
                 let __start = __sym0.0.clone();
                 let __end = __sym0.2.clone();
-                let __nt = super::__action23::<>(input, __sym0);
+                let __nt = super::__action25::<>(input, __sym0);
                 let __states_len = __states.len();
                 __states.truncate(__states_len - 1);
                 __symbols.push((__start, __Symbol::NtVar(__nt), __end));
-                18
+                19
             }
-            40 => {
+            42 => {
                 // __TopLevel = TopLevel => ActionFn(0);
                 let __sym0 = __pop_NtTopLevel(__symbols);
                 let __start = __sym0.0.clone();
@@ -1354,10 +1394,20 @@ mod __parse__TopLevel {
             _ => panic!("invalid action code {}", __action)
         };
         let __state = *__states.last().unwrap() as usize;
-        let __next_state = __GOTO[__state * 20 + __nonterminal] - 1;
+        let __next_state = __GOTO[__state * 21 + __nonterminal] - 1;
         __states.push(__next_state);
         None
     }
+    fn __pop_Term_22_21_22<
+      'input,
+    >(
+        __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize) {
+        match __symbols.pop().unwrap() {
+            (__l, __Symbol::Term_22_21_22(__v), __r) => (__l, __v, __r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
     fn __pop_Term_22_28_22<
       'input,
     >(
@@ -1498,33 +1548,33 @@ mod __parse__TopLevel {
             _ => panic!("symbol type mismatch")
         }
     }
-    fn __pop_Nt_28_22_2c_22_20_3cTerm_3e_29<
+    fn __pop_Nt_28_22_2c_22_20_3cTermOrCut_3e_29<
       'input,
     >(
         __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>
-    ) -> (usize, Term, usize) {
+    ) -> (usize, TermOrCut, usize) {
         match __symbols.pop().unwrap() {
-            (__l, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29(__v), __r) => (__l, __v, __r),
+            (__l, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29(__v), __r) => (__l, __v, __r),
             _ => panic!("symbol type mismatch")
         }
     }
-    fn __pop_Nt_28_22_2c_22_20_3cTerm_3e_29_2a<
+    fn __pop_Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2a<
       'input,
     >(
         __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>
-    ) -> (usize, ::std::vec::Vec<Term>, usize) {
+    ) -> (usize, ::std::vec::Vec<TermOrCut>, usize) {
         match __symbols.pop().unwrap() {
-            (__l, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29_2a(__v), __r) => (__l, __v, __r),
+            (__l, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2a(__v), __r) => (__l, __v, __r),
             _ => panic!("symbol type mismatch")
         }
     }
-    fn __pop_Nt_28_22_2c_22_20_3cTerm_3e_29_2b<
+    fn __pop_Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b<
       'input,
     >(
         __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>
-    ) -> (usize, ::std::vec::Vec<Term>, usize) {
+    ) -> (usize, ::std::vec::Vec<TermOrCut>, usize) {
         match __symbols.pop().unwrap() {
-            (__l, __Symbol::Nt_28_22_2c_22_20_3cTerm_3e_29_2b(__v), __r) => (__l, __v, __r),
+            (__l, __Symbol::Nt_28_22_2c_22_20_3cTermOrCut_3e_29_2b(__v), __r) => (__l, __v, __r),
             _ => panic!("symbol type mismatch")
         }
     }
@@ -1668,6 +1718,16 @@ mod __parse__TopLevel {
             _ => panic!("symbol type mismatch")
         }
     }
+    fn __pop_NtTermOrCut<
+      'input,
+    >(
+        __symbols: &mut ::std::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, TermOrCut, usize) {
+        match __symbols.pop().unwrap() {
+            (__l, __Symbol::NtTermOrCut(__v), __r) => (__l, __v, __r),
+            _ => panic!("symbol type mismatch")
+        }
+    }
     fn __pop_NtTopLevel<
       'input,
     >(
@@ -1716,64 +1776,69 @@ mod __intern_token {
                 0 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
-                        40 => /* '(' */ {
+                        33 => /* '!' */ {
                             __current_match = Some((0, __index + 1));
                             __current_state = 1;
                             continue;
                         }
-                        41 => /* ')' */ {
+                        40 => /* '(' */ {
                             __current_match = Some((1, __index + 1));
                             __current_state = 2;
                             continue;
                         }
-                        44 => /* ',' */ {
+                        41 => /* ')' */ {
                             __current_match = Some((2, __index + 1));
                             __current_state = 3;
                             continue;
                         }
-                        46 => /* '.' */ {
+                        44 => /* ',' */ {
                             __current_match = Some((3, __index + 1));
                             __current_state = 4;
                             continue;
                         }
-                        58 => /* ':' */ {
+                        46 => /* '.' */ {
+                            __current_match = Some((4, __index + 1));
                             __current_state = 5;
                             continue;
                         }
-                        63 => /* '?' */ {
+                        58 => /* ':' */ {
                             __current_state = 6;
                             continue;
                         }
-                        65 ... 90 => {
-                            __current_match = Some((11, __index + __ch.len_utf8()));
+                        63 => /* '?' */ {
                             __current_state = 7;
                             continue;
                         }
-                        91 => /* '[' */ {
-                            __current_match = Some((6, __index + 1));
+                        65 ... 90 => {
+                            __current_match = Some((12, __index + __ch.len_utf8()));
                             __current_state = 8;
                             continue;
                         }
-                        93 => /* ']' */ {
-                            __current_match = Some((8, __index + 1));
+                        91 => /* '[' */ {
+                            __current_match = Some((7, __index + 1));
                             __current_state = 9;
                             continue;
                         }
-                        95 => /* '_' */ {
+                        93 => /* ']' */ {
                             __current_match = Some((9, __index + 1));
                             __current_state = 10;
                             continue;
                         }
-                        97 ... 122 => {
-                            __current_match = Some((12, __index + __ch.len_utf8()));
+                        95 => /* '_' */ {
+                            __current_match = Some((10, __index + 1));
                             __current_state = 11;
                             continue;
                         }
-                        124 => /* '|' */ {
-                            __current_match = Some((10, __index + 1));
+                        97 ... 122 => {
+                            __current_match = Some((13, __index + __ch.len_utf8()));
                             __current_state = 12;
                             continue;
                         }
+                        124 => /* '|' */ {
+                            __current_match = Some((11, __index + 1));
+                            __current_state = 13;
+                            continue;
+                        }
                         _ => {
                             return __current_match;
                         }
@@ -1814,11 +1879,6 @@ mod __intern_token {
                 5 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
-                        45 => /* '-' */ {
-                            __current_match = Some((4, __index + 1));
-                            __current_state = 14;
-                            continue;
-                        }
                         _ => {
                             return __current_match;
                         }
@@ -1840,24 +1900,37 @@ mod __intern_token {
                 7 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
-                        48 ... 57 => {
-                            __current_match = Some((11, __index + __ch.len_utf8()));
+                        45 => /* '-' */ {
+                            __current_match = Some((6, __index + 1));
                             __current_state = 16;
                             continue;
                         }
+                        _ => {
+                            return __current_match;
+                        }
+                    }
+                }
+                8 => {
+                    let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
+                    match __ch as u32 {
+                        48 ... 57 => {
+                            __current_match = Some((12, __index + __ch.len_utf8()));
+                            __current_state = 17;
+                            continue;
+                        }
                         65 ... 90 => {
-                            __current_match = Some((11, __index + __ch.len_utf8()));
-                            __current_state = 16;
+                            __current_match = Some((12, __index + __ch.len_utf8()));
+                            __current_state = 17;
                             continue;
                         }
                         95 => /* '_' */ {
-                            __current_match = Some((11, __index + 1));
-                            __current_state = 16;
+                            __current_match = Some((12, __index + 1));
+                            __current_state = 17;
                             continue;
                         }
                         97 ... 122 => {
-                            __current_match = Some((11, __index + __ch.len_utf8()));
-                            __current_state = 16;
+                            __current_match = Some((12, __index + __ch.len_utf8()));
+                            __current_state = 17;
                             continue;
                         }
                         _ => {
@@ -1865,12 +1938,12 @@ mod __intern_token {
                         }
                     }
                 }
-                8 => {
+                9 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         93 => /* ']' */ {
-                            __current_match = Some((7, __index + 1));
-                            __current_state = 17;
+                            __current_match = Some((8, __index + 1));
+                            __current_state = 18;
                             continue;
                         }
                         _ => {
@@ -1878,7 +1951,7 @@ mod __intern_token {
                         }
                     }
                 }
-                9 => {
+                10 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         _ => {
@@ -1886,7 +1959,7 @@ mod __intern_token {
                         }
                     }
                 }
-                10 => {
+                11 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         _ => {
@@ -1894,27 +1967,27 @@ mod __intern_token {
                         }
                     }
                 }
-                11 => {
+                12 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         48 ... 57 => {
-                            __current_match = Some((12, __index + __ch.len_utf8()));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + __ch.len_utf8()));
+                            __current_state = 19;
                             continue;
                         }
                         65 ... 90 => {
-                            __current_match = Some((12, __index + __ch.len_utf8()));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + __ch.len_utf8()));
+                            __current_state = 19;
                             continue;
                         }
                         95 => /* '_' */ {
-                            __current_match = Some((12, __index + 1));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + 1));
+                            __current_state = 19;
                             continue;
                         }
                         97 ... 122 => {
-                            __current_match = Some((12, __index + __ch.len_utf8()));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + __ch.len_utf8()));
+                            __current_state = 19;
                             continue;
                         }
                         _ => {
@@ -1922,7 +1995,7 @@ mod __intern_token {
                         }
                     }
                 }
-                12 => {
+                13 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         _ => {
@@ -1930,7 +2003,7 @@ mod __intern_token {
                         }
                     }
                 }
-                13 => {
+                14 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         _ => {
@@ -1938,7 +2011,7 @@ mod __intern_token {
                         }
                     }
                 }
-                14 => {
+                15 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         _ => {
@@ -1946,7 +2019,7 @@ mod __intern_token {
                         }
                     }
                 }
-                15 => {
+                16 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         _ => {
@@ -1954,27 +2027,27 @@ mod __intern_token {
                         }
                     }
                 }
-                16 => {
+                17 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         48 ... 57 => {
-                            __current_match = Some((11, __index + __ch.len_utf8()));
-                            __current_state = 16;
+                            __current_match = Some((12, __index + __ch.len_utf8()));
+                            __current_state = 17;
                             continue;
                         }
                         65 ... 90 => {
-                            __current_match = Some((11, __index + __ch.len_utf8()));
-                            __current_state = 16;
+                            __current_match = Some((12, __index + __ch.len_utf8()));
+                            __current_state = 17;
                             continue;
                         }
                         95 => /* '_' */ {
-                            __current_match = Some((11, __index + 1));
-                            __current_state = 16;
+                            __current_match = Some((12, __index + 1));
+                            __current_state = 17;
                             continue;
                         }
                         97 ... 122 => {
-                            __current_match = Some((11, __index + __ch.len_utf8()));
-                            __current_state = 16;
+                            __current_match = Some((12, __index + __ch.len_utf8()));
+                            __current_state = 17;
                             continue;
                         }
                         _ => {
@@ -1982,7 +2055,7 @@ mod __intern_token {
                         }
                     }
                 }
-                17 => {
+                18 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         _ => {
@@ -1990,27 +2063,27 @@ mod __intern_token {
                         }
                     }
                 }
-                18 => {
+                19 => {
                     let (__index, __ch) = match __chars.next() { Some(p) => p, None => return __current_match };
                     match __ch as u32 {
                         48 ... 57 => {
-                            __current_match = Some((12, __index + __ch.len_utf8()));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + __ch.len_utf8()));
+                            __current_state = 19;
                             continue;
                         }
                         65 ... 90 => {
-                            __current_match = Some((12, __index + __ch.len_utf8()));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + __ch.len_utf8()));
+                            __current_state = 19;
                             continue;
                         }
                         95 => /* '_' */ {
-                            __current_match = Some((12, __index + 1));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + 1));
+                            __current_state = 19;
                             continue;
                         }
                         97 ... 122 => {
-                            __current_match = Some((12, __index + __ch.len_utf8()));
-                            __current_state = 18;
+                            __current_match = Some((13, __index + __ch.len_utf8()));
+                            __current_state = 19;
                             continue;
                         }
                         _ => {
@@ -2272,8 +2345,8 @@ pub fn __action16<
     input: &'input str,
     (_, c, _): (usize, Term, usize),
     (_, _, _): (usize, &'input str, usize),
-    (_, h, _): (usize, Term, usize),
-    (_, cs, _): (usize, ::std::vec::Vec<Term>, usize),
+    (_, h, _): (usize, TermOrCut, usize),
+    (_, cs, _): (usize, ::std::vec::Vec<TermOrCut>, usize),
 ) -> Rule
 {
     Rule { head: (c, h), clauses: cs }
@@ -2286,17 +2359,40 @@ pub fn __action17<
     input: &'input str,
     (_, a, _): (usize, Atom, usize),
     (_, _, _): (usize, &'input str, usize),
-    (_, h, _): (usize, Term, usize),
-    (_, cs, _): (usize, ::std::vec::Vec<Term>, usize),
+    (_, h, _): (usize, TermOrCut, usize),
+    (_, cs, _): (usize, ::std::vec::Vec<TermOrCut>, usize),
 ) -> Rule
 {
-    Rule { head: (Term::Constant(Cell::default(), Constant::Atom(a)), h),
+    Rule { head: (Term::Constant(Cell::default(), Constant::Atom(a)),
+                     h),
                clauses: cs }
 }
 
 #[allow(unused_variables)]
 pub fn __action18<
     'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+) -> TermOrCut
+{
+    TermOrCut::Cut
+}
+
+#[allow(unused_variables)]
+pub fn __action19<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Term, usize),
+) -> TermOrCut
+{
+    TermOrCut::Term(__0)
+}
+
+#[allow(unused_variables)]
+pub fn __action20<
+    'input,
 >(
     input: &'input str,
     (_, __0, _): (usize, Atom, usize),
@@ -2306,7 +2402,7 @@ pub fn __action18<
 }
 
 #[allow(unused_variables)]
-pub fn __action19<
+pub fn __action21<
     'input,
 >(
     input: &'input str,
@@ -2317,7 +2413,7 @@ pub fn __action19<
 }
 
 #[allow(unused_variables)]
-pub fn __action20<
+pub fn __action22<
     'input,
 >(
     input: &'input str,
@@ -2328,7 +2424,7 @@ pub fn __action20<
 }
 
 #[allow(unused_variables)]
-pub fn __action21<
+pub fn __action23<
     'input,
 >(
     input: &'input str,
@@ -2339,7 +2435,7 @@ pub fn __action21<
 }
 
 #[allow(unused_variables)]
-pub fn __action22<
+pub fn __action24<
     'input,
 >(
     input: &'input str,
@@ -2350,7 +2446,7 @@ pub fn __action22<
 }
 
 #[allow(unused_variables)]
-pub fn __action23<
+pub fn __action25<
     'input,
 >(
     input: &'input str,
@@ -2361,42 +2457,42 @@ pub fn __action23<
 }
 
 #[allow(unused_variables)]
-pub fn __action24<
+pub fn __action26<
     'input,
 >(
     input: &'input str,
     __lookbehind: &usize,
     __lookahead: &usize,
-) -> ::std::vec::Vec<Term>
+) -> ::std::vec::Vec<TermOrCut>
 {
     vec![]
 }
 
 #[allow(unused_variables)]
-pub fn __action25<
+pub fn __action27<
     'input,
 >(
     input: &'input str,
-    (_, v, _): (usize, ::std::vec::Vec<Term>, usize),
-) -> ::std::vec::Vec<Term>
+    (_, v, _): (usize, ::std::vec::Vec<TermOrCut>, usize),
+) -> ::std::vec::Vec<TermOrCut>
 {
     v
 }
 
 #[allow(unused_variables)]
-pub fn __action26<
+pub fn __action28<
     'input,
 >(
     input: &'input str,
     (_, _, _): (usize, &'input str, usize),
-    (_, __0, _): (usize, Term, usize),
-) -> Term
+    (_, __0, _): (usize, TermOrCut, usize),
+) -> TermOrCut
 {
     (__0)
 }
 
 #[allow(unused_variables)]
-pub fn __action27<
+pub fn __action29<
     'input,
 >(
     input: &'input str,
@@ -2407,7 +2503,7 @@ pub fn __action27<
 }
 
 #[allow(unused_variables)]
-pub fn __action28<
+pub fn __action30<
     'input,
 >(
     input: &'input str,
@@ -2419,7 +2515,7 @@ pub fn __action28<
 }
 
 #[allow(unused_variables)]
-pub fn __action29<
+pub fn __action31<
     'input,
 >(
     input: &'input str,
@@ -2430,7 +2526,7 @@ pub fn __action29<
 }
 
 #[allow(unused_variables)]
-pub fn __action30<
+pub fn __action32<
     'input,
 >(
     input: &'input str,
@@ -2442,7 +2538,7 @@ pub fn __action30<
 }
 
 #[allow(unused_variables)]
-pub fn __action31<
+pub fn __action33<
     'input,
 >(
     input: &'input str,
@@ -2453,7 +2549,7 @@ pub fn __action31<
 }
 
 #[allow(unused_variables)]
-pub fn __action32<
+pub fn __action34<
     'input,
 >(
     input: &'input str,
@@ -2465,7 +2561,7 @@ pub fn __action32<
 }
 
 #[allow(unused_variables)]
-pub fn __action33<
+pub fn __action35<
     'input,
 >(
     input: &'input str,
@@ -2476,7 +2572,7 @@ pub fn __action33<
 }
 
 #[allow(unused_variables)]
-pub fn __action34<
+pub fn __action36<
     'input,
 >(
     input: &'input str,
@@ -2488,70 +2584,70 @@ pub fn __action34<
 }
 
 #[allow(unused_variables)]
-pub fn __action35<
+pub fn __action37<
     'input,
 >(
     input: &'input str,
-    (_, __0, _): (usize, Term, usize),
-) -> ::std::vec::Vec<Term>
+    (_, __0, _): (usize, TermOrCut, usize),
+) -> ::std::vec::Vec<TermOrCut>
 {
     vec![__0]
 }
 
 #[allow(unused_variables)]
-pub fn __action36<
+pub fn __action38<
     'input,
 >(
     input: &'input str,
-    (_, v, _): (usize, ::std::vec::Vec<Term>, usize),
-    (_, e, _): (usize, Term, usize),
-) -> ::std::vec::Vec<Term>
+    (_, v, _): (usize, ::std::vec::Vec<TermOrCut>, usize),
+    (_, e, _): (usize, TermOrCut, usize),
+) -> ::std::vec::Vec<TermOrCut>
 {
     { let mut v = v; v.push(e); v }
 }
 
 #[allow(unused_variables)]
-pub fn __action37<
+pub fn __action39<
     'input,
 >(
     input: &'input str,
     __0: (usize, &'input str, usize),
-    __1: (usize, Term, usize),
-) -> ::std::vec::Vec<Term>
+    __1: (usize, TermOrCut, usize),
+) -> ::std::vec::Vec<TermOrCut>
 {
     let __start0 = __0.0.clone();
     let __end0 = __1.2.clone();
-    let __temp0 = __action26(
+    let __temp0 = __action28(
         input,
         __0,
         __1,
     );
     let __temp0 = (__start0, __temp0, __end0);
-    __action35(
+    __action37(
         input,
         __temp0,
     )
 }
 
 #[allow(unused_variables)]
-pub fn __action38<
+pub fn __action40<
     'input,
 >(
     input: &'input str,
-    __0: (usize, ::std::vec::Vec<Term>, usize),
+    __0: (usize, ::std::vec::Vec<TermOrCut>, usize),
     __1: (usize, &'input str, usize),
-    __2: (usize, Term, usize),
-) -> ::std::vec::Vec<Term>
+    __2: (usize, TermOrCut, usize),
+) -> ::std::vec::Vec<TermOrCut>
 {
     let __start0 = __1.0.clone();
     let __end0 = __2.2.clone();
-    let __temp0 = __action26(
+    let __temp0 = __action28(
         input,
         __1,
         __2,
     );
     let __temp0 = (__start0, __temp0, __end0);
-    __action36(
+    __action38(
         input,
         __0,
         __temp0,
@@ -2559,18 +2655,18 @@ pub fn __action38<
 }
 
 #[allow(unused_variables)]
-pub fn __action39<
+pub fn __action41<
     'input,
 >(
     input: &'input str,
     __0: (usize, Term, usize),
     __1: (usize, &'input str, usize),
-    __2: (usize, Term, usize),
+    __2: (usize, TermOrCut, usize),
 ) -> Rule
 {
     let __start0 = __2.2.clone();
     let __end0 = __2.2.clone();
-    let __temp0 = __action24(
+    let __temp0 = __action26(
         input,
         &__start0,
         &__end0,
@@ -2586,19 +2682,19 @@ pub fn __action39<
 }
 
 #[allow(unused_variables)]
-pub fn __action40<
+pub fn __action42<
     'input,
 >(
     input: &'input str,
     __0: (usize, Term, usize),
     __1: (usize, &'input str, usize),
-    __2: (usize, Term, usize),
-    __3: (usize, ::std::vec::Vec<Term>, usize),
+    __2: (usize, TermOrCut, usize),
+    __3: (usize, ::std::vec::Vec<TermOrCut>, usize),
 ) -> Rule
 {
     let __start0 = __3.0.clone();
     let __end0 = __3.2.clone();
-    let __temp0 = __action25(
+    let __temp0 = __action27(
         input,
         __3,
     );
@@ -2613,18 +2709,18 @@ pub fn __action40<
 }
 
 #[allow(unused_variables)]
-pub fn __action41<
+pub fn __action43<
     'input,
 >(
     input: &'input str,
     __0: (usize, Atom, usize),
     __1: (usize, &'input str, usize),
-    __2: (usize, Term, usize),
+    __2: (usize, TermOrCut, usize),
 ) -> Rule
 {
     let __start0 = __2.2.clone();
     let __end0 = __2.2.clone();
-    let __temp0 = __action24(
+    let __temp0 = __action26(
         input,
         &__start0,
         &__end0,
@@ -2640,19 +2736,19 @@ pub fn __action41<
 }
 
 #[allow(unused_variables)]
-pub fn __action42<
+pub fn __action44<
     'input,
 >(
     input: &'input str,
     __0: (usize, Atom, usize),
     __1: (usize, &'input str, usize),
-    __2: (usize, Term, usize),
-    __3: (usize, ::std::vec::Vec<Term>, usize),
+    __2: (usize, TermOrCut, usize),
+    __3: (usize, ::std::vec::Vec<TermOrCut>, usize),
 ) -> Rule
 {
     let __start0 = __3.0.clone();
     let __end0 = __3.2.clone();
-    let __temp0 = __action25(
+    let __temp0 = __action27(
         input,
         __3,
     );
@@ -2667,7 +2763,7 @@ pub fn __action42<
 }
 
 #[allow(unused_variables)]
-pub fn __action43<
+pub fn __action45<
     'input,
 >(
     input: &'input str,
@@ -2677,20 +2773,20 @@ pub fn __action43<
 {
     let __start0 = __0.0.clone();
     let __end0 = __1.2.clone();
-    let __temp0 = __action32(
+    let __temp0 = __action34(
         input,
         __0,
         __1,
     );
     let __temp0 = (__start0, __temp0, __end0);
-    __action33(
+    __action35(
         input,
         __temp0,
     )
 }
 
 #[allow(unused_variables)]
-pub fn __action44<
+pub fn __action46<
     'input,
 >(
     input: &'input str,
@@ -2701,13 +2797,13 @@ pub fn __action44<
 {
     let __start0 = __1.0.clone();
     let __end0 = __2.2.clone();
-    let __temp0 = __action32(
+    let __temp0 = __action34(
         input,
         __1,
         __2,
     );
     let __temp0 = (__start0, __temp0, __end0);
-    __action34(
+    __action36(
         input,
         __0,
         __temp0,
@@ -2715,7 +2811,7 @@ pub fn __action44<
 }
 
 #[allow(unused_variables)]
-pub fn __action45<
+pub fn __action47<
     'input,
 >(
     input: &'input str,
@@ -2727,7 +2823,7 @@ pub fn __action45<
 {
     let __start0 = __1.2.clone();
     let __end0 = __2.0.clone();
-    let __temp0 = __action30(
+    let __temp0 = __action32(
         input,
         &__start0,
         &__end0,
@@ -2744,7 +2840,7 @@ pub fn __action45<
 }
 
 #[allow(unused_variables)]
-pub fn __action46<
+pub fn __action48<
     'input,
 >(
     input: &'input str,
@@ -2757,7 +2853,7 @@ pub fn __action46<
 {
     let __start0 = __2.0.clone();
     let __end0 = __2.2.clone();
-    let __temp0 = __action31(
+    let __temp0 = __action33(
         input,
         __2,
     );
@@ -2773,7 +2869,7 @@ pub fn __action46<
 }
 
 #[allow(unused_variables)]
-pub fn __action47<
+pub fn __action49<
     'input,
 >(
     input: &'input str,
@@ -2782,19 +2878,19 @@ pub fn __action47<
 {
     let __start0 = __0.0.clone();
     let __end0 = __0.2.clone();
-    let __temp0 = __action29(
+    let __temp0 = __action31(
         input,
         __0,
     );
     let __temp0 = (__start0, __temp0, __end0);
-    __action27(
+    __action29(
         input,
         __temp0,
     )
 }
 
 #[allow(unused_variables)]
-pub fn __action48<
+pub fn __action50<
     'input,
 >(
     input: &'input str,
@@ -2804,12 +2900,12 @@ pub fn __action48<
 {
     let __start0 = __1.0.clone();
     let __end0 = __1.2.clone();
-    let __temp0 = __action29(
+    let __temp0 = __action31(
         input,
         __1,
     );
     let __temp0 = (__start0, __temp0, __end0);
-    __action28(
+    __action30(
         input,
         __0,
         __temp0,