(def-language det-state-machine-language
    (base-types state action)
    (constants 
      (next (state action state))))
            


(def-theory det-state-machines 
    (language det-state-machine-language)
    (component-theories state-machines)
    (axioms
      (tr-means-next
        "forall(s:state, a:action, s_1:state, tr(s,a,s_1) iff next(s,a)=s_1)"
        rewrite)))
(language-from-definition
  '(start-det-state-machine-language
      (base-types state action)
      (constants 
        (s_init state))))


(def-theorem next-preserves-accessible 
  "forall(s,s_1:state, a:action, accessible(s) and next(s,a)=s_1 implies accessible(s_1))"
  (theory det-state-machines)
  (usages )
  (proof "$theories/state-machines/proofs/next-preserves-accessible.t"))


(def-theorem run-next 
  "forall(s_1:state,a:action,a_seq:[nn,action], 
 	 run(next(s_1,a),a_seq)==run(s_1,cons(a,a_seq)))"
  (theory det-state-machines)
  (usages transportable-macete)
  (proof "$theories/state-machines/proofs/run-next.t"))


(def-theorem det-fun-sm-thm 
  "forall(p:[state,prop],
	(forall(s:state, initial(s) implies p(s))
	and
	  forall(s:state, a:action,
		p(s)
		implies
		p(next(s,a))))
	implies
	  forall(s:state, accessible(s) implies p(s)))"
  (theory det-state-machines)
  (usages transportable-macete)
  (proof "$theories/state-machines/proofs/det-fun-sm-thm.t"))


(def-theorem dsm-induction-biconditional-conv 
  "forall(p:[state,prop], forall(s:state, accessible(s) implies p(s)) 
 	 iff
 	 (forall(s:state,  initial(s) implies p(s))
 	 and 
	  forall(s_1:state,a:action, 
	    accessible(s_1) and p(s_1) and #(next(s_1,a))
	    implies
	    p(next(s_1,a)))))"
  (theory det-state-machines)
  (usages transportable-macete)
  (proof "$theories/state-machines/proofs/dsm-induction-biconditional-conv.t"))


(def-theorem dsm-induction-biconditional 
    "forall(p:[state,prop],
	(forall(s:state,  initial(s) implies p(s))
 	 and 
	  forall(s_1:state,a:action, 
	    accessible(s_1) and p(s_1) and #(next(s_1,a))
	    implies
	    p(next(s_1,a))))
 	 iff
 	 forall(s:state, accessible(s) implies p(s)))"
    (theory det-state-machines)
    (usages transportable-macete)
    (proof;just cite the preceding and simplify.
      ""))


(def-theorem run-run-lemma 
  "forall(a_seq_1:[nn,action], 
          f_seq_q(a_seq_1) implies
                forall(s_1:state, a_seq_2:[nn,action],
	run(run(s_1,a_seq_1),a_seq_2)==run(s_1, append(a_seq_1,a_seq_2))))"
  (theory det-state-machines)
  (usages )
  (proof "$theories/state-machines/proofs/run-run-lemma.t"))
(qr "forall(a_seq_1:[nn,action], 
          f_seq_q(a_seq_1) implies
                forall(s_1:state, a_seq_2:[nn,action],
	run(s_1, append(a_seq_1,a_seq_2))==run(run(s_1,a_seq_1),a_seq_2)))")


(def-theorem run-run 
  "forall(s_1:state, a_seq_1, a_seq_2:[nn,action], 
          f_seq_q(a_seq_1) implies
	run(run(s_1,a_seq_1),a_seq_2)==run(s_1, append(a_seq_1,a_seq_2)))"
  (theory det-state-machines)
  (usages transportable-macete)
  (proof "$theories/state-machines/proofs/run-run.t"))


(def-constant after 
    "lambda(a_seq:[nn,action], run(s_init, a_seq))"
    (theory det-state-machines-with-start)
    (usages transportable-macete))
(language-from-definition
  '(det-state-machine-sublanguage
      (embedded-languages det-state-machine-language start-det-state-machine-language)))