(**************************************************************)
(*   Copyright Dominique Larchey-Wendling [*]                 *)
(*                                                            *)
(*                             [*] Affiliation LORIA -- CNRS  *)
(**************************************************************)
(*      This file is distributed under the terms of the       *)
(*         CeCILL v2 FREE SOFTWARE LICENSE AGREEMENT          *)
(**************************************************************)
(** * Minsky machines to FRACTRAN programs *)
(** ** Removal of self-loops in MMs *)
Set Implicit Arguments.
Tactic Notation "rew" "length" := autorewrite with length_db.
Local Notation "e #> x" := (vec_pos e x).
Local Notation "e [ v / x ]" := (vec_change e x v).
Local Notation "I // s -1> t" := (mm_sss I s t).
Local Notation "P // s -[ k ]-> t" := (sss_steps (@mm_sss _) P k s t).
Local Notation "P // s -+> t" := (sss_progress (@mm_sss _) P s t).
Local Notation "P // s ->> t" := (sss_compute (@mm_sss _) P s t).
Local Notation "P // s '~~>' t" := (sss_output (@mm_sss _) P s t).
Local Notation "P // s ↓" := (sss_terminates (@mm_sss _) P s).
Section self_loops.
Variables (n : nat) (P : list (mm_instr n)).

(* Specifications: *)
Lemma mm_self_loop_no_term_1 i x s v :
(i,DEC x i::nil) <sc (1,P)
-> s = (i,v)
-> v#>x = 0
-> ~ (1,P) // s ↓.
Lemma mm_self_loop_no_term_2 i x s v :
(i,DEC x (1+i)::DEC x i::nil) <sc (1,P)
-> s = (i,v) \/ s = (1+i,v)
-> v#>x = 0
-> ~ (1,P) // s ↓.