open Defn TotalDefn;

val (IOTA,IOTA_IND) = tprove
(Hol_defn "IOTA" `IOTA b = if b > t then [] else b::IOTA (b+1)`,
 TotalDefn.WF_REL_TAC `measure \x. t+1 - x`);


(* From Peter Sestoft. Taken from examples directory of MoscowML 2.00. *)

val ACCUPERMS_defn =
 Hol_defn "ACCUPERMS" 
    `(ACCUPERMS []      tail res = tail :: res) 
  /\ (ACCUPERMS (x::xr) tail res = CYCLE [] x xr tail res)
  /\ (CYCLE left mid [] tail res = ACCUPERMS left (mid::tail) res)
  /\ (CYCLE left mid (r::rr) tail res = 
       CYCLE (mid::left) r rr tail 
           (ACCUPERMS (APPEND left (r::rr)) (mid::tail) res))`;


tgoal ACCUPERMS_defn;
e (WF_REL_TAC `inv_image ($< LEX $<)
     (sum_case (\(x,y,z). LENGTH x)
               (\(v,w,x,y,z). LENGTH x))`);

e (WF_REL_TAC `measure
     (sum_case (\(x,y,z). LENGTH x)
               (\(v,w,x,y,z). LENGTH x))`);

e (WF_REL_TAC `inv_image ($< LEX $<)
     (sum_case (\(x,y,z). LENGTH x)
               (\(v,w,x,y,z). LENGTH x))`);
        


val PERMS = Define `PERMS xs = ACCUPERMS xs [] []`;
val PERMSN = Define `PERMSN n = perms (IOTA n 0)`;

