(def-theorem copy-definedness 
    "forall(phi:[place -> word], h:[place -> place], #(copy(phi,h)))"
    (theory places)
    (usages d-r-convergence)
    (proof
      (
        (unfold-single-defined-constant-globally copy)
        simplify-insistently)))


(def-theorem a%copy-definedness 
    "forall(phi:[place -> word], h:[place -> place], copy%fn(phi,h) implies #(a%copy(phi,h)))"
    (theory places)
    (usages d-r-convergence)
    (proof
      (
        (unfold-single-defined-constant-globally a%copy)
        simplify)))


(def-theorem user%eq-transitivity 
    "forall(gamma_0, gamma_1, gamma_2:[place -> word], v:sets[place], 
        user%eq(gamma_0,gamma_1, v)  and user%eq(gamma_1,gamma_2, v)
        implies user%eq(gamma_0,gamma_2, v))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally user%eq)
        direct-and-antecedent-inference-strategy)))


(def-theorem user%eq-abstr 
    "forall (sigma_1, sigma_2:istate, v:sets[place], 
        user%eq(abstr(sigma_1), abstr(sigma_2), v) 
        iff
          restrict{lambda(p:place, promote(sigma_1, p)),v}
        =restrict{lambda(p:place, promote(sigma_2, p)),v})"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally abstr)
        (unfold-single-defined-constant-globally user%eq))))


(def-theorem c%shadow-definedness 
    "forall(sigma:istate, f:[place -> place], copy%fn(abstr(sigma),f) implies 
	#(c%shadow(sigma, f)))"
    (theory places)
    (usages d-r-convergence)
    (proof
      (
        (unfold-single-defined-constant-globally c%shadow)
        simplify
        (apply-macete-with-minor-premises copy-liveness-corollary)
        simplify)))


(def-theorem lower-definedness 
    "forall(sigma:istate, h:[place -> place], 
	#(lower(sigma,h)))"
    (theory places)
    (usages d-r-convergence)
    (proof
      (
        (unfold-single-defined-constant-globally lower)
        simplify-insistently)))


(def-theorem c%copy-definedness 
    "forall(sigma:istate, h:[place -> place], 
          copy%fn(abstr(sigma),h) implies
              #(c%copy(sigma,lower(sigma,h))))"
    (theory places)
    (proof
      (
        (apply-macete-with-minor-premises copy-liveness-corollary)
        simplify)))


(def-theorem lower-is-c%copy%fn 
      "forall(sigma:istate,h:[place,place],p:place,
	c%copy%fn(sigma,lower(sigma,h)))"
      (theory places)
      (proof
        (
          (unfold-single-defined-constant-globally c%copy%fn)
          (unfold-single-defined-constant-globally lower)
          simplify)))


(def-theorem default-c%copy-bound%place  
    "forall(sigma:istate, h:[place -> place], p:place, 
          p in bound%place(sigma) implies
              default(c%copy(sigma,lower(sigma,h)))(p)==default(sigma)(p))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally c%copy)
        (apply-macete-with-minor-premises lower-is-c%copy%fn)
        simplify
        (unfold-single-defined-constant-globally lower)
        simplify)))


(def-theorem default-c%copy-un-bound%place 
    "forall(sigma:istate, h:[place -> place], p:place, 
          not(p in bound%place(sigma)) implies
              default(c%copy(sigma,lower(sigma,h)))(p)==h(p))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally c%copy)
        (apply-macete-with-minor-premises lower-is-c%copy%fn)
        simplify
        (unfold-single-defined-constant-globally lower)
        simplify)))


(def-theorem gamma-c%copy-unchanged 
    "forall(sigma:istate, h:[place -> place], 
        gamma(c%copy(sigma,lower(sigma,h)))=gamma(sigma))"
    (theory places)
    (usages rewrite)
    (proof
      (
        (unfold-single-defined-constant-globally c%copy)
        (apply-macete-with-minor-premises lower-is-c%copy%fn)
        simplify)))


(def-theorem gamma-c%shadow-unchanged 
    "forall(sigma:istate, f:[place -> place], 
    #(c%shadow(sigma,f)) implies 
      dom{gamma(c%shadow(sigma,f))}=dom{gamma(sigma)})"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally c%shadow)
        simplify)))


(def-theorem in-range-condition 
    "forall(y:ind_1,h:[ind_1 -> ind_2], h(y) in ran{h} iff #(h(y)))"
    (theory generic-theory-2)
    (usages transportable-macete transportable-rewrite)
    (proof
      (
        direct-and-antecedent-inference-strategy
        beta-reduce-insistently
        simplify
        (instantiate-existential ("y_$0")))))


(def-theorem dom-ran-disjointness-lemma 
    "forall(h,g:[ind_1->ind_1], dom{h} disj dom{g} implies
    dom{(inverse{g}) oo h} disj ran{(inverse{g}) oo h})"
    (theory generic-theory-1)
    (proof
      (
        simplify-insistently
        direct-and-antecedent-inference-strategy
        (case-split ("#(h(x_$5))"))
        (move-to-sibling 2)
        simplify
        (block 
            (script-comment "`case-split' at (1)")
            beta-reduce
            (eliminate-iota 0)
            direct-and-antecedent-inference-strategy
            auto-instantiate-existential
            (contrapose "with(p:prop,forall(x_$0:ind_1,p or p));")
            (instantiate-existential ("x_$0"))
            simplify))))


(def-theorem c%shadow-of-c%copy-definedness 
    "forall(sigma:istate,g,h,f,h%plus:[place,place],v:sets[place],
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p)))
      and 
    copy%fn(abstr(sigma),h%plus)
      and 
    ran{h} subseteq bound%place(sigma)
      and 
    dom{h} disj bound%place(sigma)
      and 
    ran{h} disj ran{default(sigma)}
      and 
    bijective_on_q{g,dom{g},ran{h}}
      and 
    dom{g} disj bound%place(sigma)
      and 
    dom{g} disj dom{h}
      and 
    dom{g} disj ran{h}
      and 
    dom{g} disj v
      and 
    f
    =lambda(p:place,
          if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))),
              p,
              #(g(p)),
              g(p),
              ?place))
      implies 
    #(c%shadow(c%copy(sigma,lower(sigma,h%plus)),f)));"
    (theory places)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (unfold-single-defined-constant-globally c%shadow)
        beta-reduce-with-minor-premises
        (move-to-sibling 1)
        (apply-macete-with-minor-premises c%copy-definedness)
        (block 
            (script-comment "`beta-reduce-with-minor-premises' at (0)")
            (raise-conditional (0))
            direct-inference
            (apply-macete-with-minor-premises copy-liveness-corollary)
            (block 
	(script-comment "`direct-inference' at (1)")
	(contrapose "with(p:prop,not(p));")
	(apply-macete-with-minor-premises a%copy-definedness)
	(unfold-single-defined-constant-globally copy%fn)
	direct-inference
	(block 
	    (script-comment "`direct-inference' at (0)")
	    (apply-macete-with-minor-premises tr%domain-membership-iff-defined)
	    (apply-macete-with-minor-premises rev%bound%place-abstr-definedness)
	    (backchain "with(f:[place,place],f)
=with(f:sets[place],
      lambda(p:place,
          with(p:prop,
              if(with(p:place,p in f),
                  with(p:place,p),
                  with(p:prop,p),
                  with(p:place,p),
                  with(p:place,p)))));")
	    beta-reduce
	    simplify)
	(block 
	    (script-comment "`direct-inference' at (1)")
	    (backchain "with(f:[place,place],f)
=with(f:sets[place],
      lambda(p:place,
          with(p:prop,
              if(with(p:place,p in f),
                  with(p:place,p),
                  with(p:prop,p),
                  with(p:place,p),
                  with(p:place,p)))));")
	    beta-reduce-insistently
	    (raise-conditional (0))
	    (raise-conditional (2))
	    direct-and-antecedent-inference-strategy
	    (contrapose "with(w:word,not(#(w)));")
	    (apply-macete-with-minor-premises rev%bound%place-abstr-definedness)
	    (backchain "with(p,x_$0:place,x_$0=p);")
	    (raise-conditional (0))
	    (raise-conditional (0))
	    simplify
	    direct-and-antecedent-inference-strategy
	    (block 
	        (script-comment "`direct-and-antecedent-inference-strategy' at (0 0)")
	        (contrapose "with(p,x_$0:place,x_$0=p);")
	        (raise-conditional (0))
	        (raise-conditional (0))
	        simplify)
	    (block 
	        (script-comment "`direct-and-antecedent-inference-strategy' at (0 1)")
	        (cut-with-single-formula "forsome(y:place, g(x)=h(y))")
	        (block 
	            (script-comment "`cut-with-single-formula' at (0)")
	            (antecedent-inference-strategy (0))
	            (backchain "with(y:place,h:[place,place],x:place,g:[place,place],
    g(x)=h(y));")
	            (apply-macete-with-minor-premises bound%place-abstr-definedness)
	            (apply-macete-with-minor-premises copy-liveness)
	            (unfold-single-defined-constant-globally a%copy)
	            (raise-conditional (0))
	            direct-and-antecedent-inference-strategy
	            (unfold-single-defined-constant-globally copy)
	            (backchain "with(h:[place,place],f:sets[place],h%plus:[place,place],
    h%plus=lambda(p:place,if(p in f, p, h(p))));")
	            beta-reduce
	            (raise-conditional (0))
	            (apply-macete-with-minor-premises rev%bound%place-abstr-definedness)
	            direct-and-antecedent-inference-strategy
	            (contrapose "with(y:place,h:[place,place],sigma:istate,
    not(h(y) in bound%place(sigma)));")
	            (backchain "with(f:sets[place],f subseteq f);")
	            (apply-macete-with-minor-premises tr%in-range-condition))
	        (block 
	            (script-comment "`cut-with-single-formula' at (1)")
	            (contrapose "with(h,g:[place,place],ran{g}=ran{h});")
	            extensionality
	            simplify-insistently
	            (instantiate-existential ("g(x)"))
	            (contrapose "with(x:place,g:[place,place],
    forall(x_$1:place,not(g(x)=g(x_$1))));")
	            (instantiate-existential ("x"))))))))))


(def-theorem default-in-bound-place-implies-bound 
    "forall(p:place,sigma:istate,
          default(sigma)(p) in bound%place(sigma)
            implies 
          p in bound%place(sigma));"
    (theory places)
    (proof
      (
        (apply-macete-with-minor-premises bound%place-characterization)
        (apply-macete-with-minor-premises tr%meaning-of-indic-from-pred-element)
        simplify
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises tr%first%entry-equation)
        simplify)))


(def-theorem copy-fn-dom-bound 
    "forall(h:[place,place],sigma:istate,
    #(c%copy(sigma,h)) and ran{h} subseteq bound%place(sigma)
      implies 
    dom{h} subseteq bound%place(c%copy(sigma,h)));"
    (theory places)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "default(c%copy(sigma,h))= h")
        (move-to-sibling 1)
        (block 
            (script-comment "`cut-with-single-formula' at (1)")
            (incorporate-antecedent "with(f:istate,#(f));")
            (unfold-single-defined-constant-globally c%copy)
            simplify)
        (block 
            (script-comment "`cut-with-single-formula' at (0)")
            simplify-insistently
            direct-and-antecedent-inference-strategy
            (apply-macete-with-minor-premises default-in-bound-place-implies-bound)
            simplify
            (instantiate-universal-antecedent "with(f:sets[place],f subseteq f);"
					("h(x_$0)"))
            (block 
	(script-comment "`instantiate-universal-antecedent' at (0 0 0)")
	(contrapose "with(p:prop,not(p));")
	(apply-macete-with-minor-premises tr%in-range-condition))
            (block 
	(script-comment "`instantiate-universal-antecedent' at (0 0 1)")
	(apply-macete-with-minor-premises bound%place%stability)
	direct-and-antecedent-inference-strategy)))))


(def-theorem c%shadow-c%copy-definedness 
    "
        forall(sigma:istate,g,h,f,h%plus:[place,place],
            h%plus
            =lambda(p:place,if(p in bound%place(sigma), p, h(p)))
              and 
            copy%fn(abstr(sigma),h%plus)
              and 
            ran{h} subseteq bound%place(sigma)
              and
            ran{g}=ran{h}
              and 
            f
            =lambda(p:place,
                  if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))),
                      p,
                      #(g(p)),
                      g(p),
                      ?place))
              implies 
            #(c%shadow(c%copy(sigma,lower(sigma,h%plus)),f)))"
    (theory places)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises c%shadow-definedness)
        (unfold-single-defined-constant-globally copy%fn)
        beta-reduce-with-minor-premises
        (move-to-sibling 1)
        (apply-macete-with-minor-premises c%copy-definedness)
        (block 
            (script-comment "`beta-reduce-with-minor-premises' at (0)")
            (force-substitution "dom{abstr(c%copy(sigma,lower(sigma,h%plus)))}"
			    "bound%place(c%copy(sigma,lower(sigma,h%plus)))"
			    (0 1))
            (move-to-sibling 1)
            (block 
	(script-comment "`force-substitution' at (1)")
	extensionality
	simplify
	(apply-macete-with-minor-premises bound%place-abstr-definedness)
	direct-and-antecedent-inference-strategy
	(apply-macete-with-minor-premises tr%value-of-a-defined-indicator-application)
	(apply-macete-with-minor-premises bound%place-abstr-definedness))
            (block 
	(script-comment "`force-substitution' at (0)")
	(backchain-repeatedly ("with(g,h%plus:[place,place],sigma:istate,f:[place,place],
    f
    =lambda(p:place,
          if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))),
              p,
              #(g(p)),
              g(p),
              ?place)));"))
	beta-reduce
	direct-and-antecedent-inference-strategy
	simplify
	(block 
	    (script-comment "`direct-and-antecedent-inference-strategy' at (1)")
	    beta-reduce-insistently
	    (apply-macete-with-minor-premises tr%definedness-of-dangling-conditionals)
	    direct-and-antecedent-inference-strategy
	    (incorporate-antecedent "with(p,x_$0:place,x_$0=p);")
	    (case-split-on-conditionals (0))
	    direct-inference
	    (cut-with-single-formula "forsome(y:place, x_$0=h(y))")
	    (block 
	        (script-comment "`cut-with-single-formula' at (0)")
	        (antecedent-inference "with(p:prop,forsome(y:place,p));")
	        (backchain "with(p,x_$0:place,x_$0=p);")
	        (instantiate-universal-antecedent "with(f:sets[place],f subseteq f);"
					            ("h(y)"))
	        (block 
	            (script-comment "`instantiate-universal-antecedent' at (0 0 0)")
	            (contrapose "with(y:place,h:[place,place],not(h(y) in ran{h}));")
	            (apply-macete-with-minor-premises tr%in-range-condition))
	        (block 
	            (script-comment "`instantiate-universal-antecedent' at (0 0 1)")
	            (apply-macete-with-minor-premises bound%place%stability)
	            (apply-macete-with-minor-premises c%copy-definedness)
	            direct-and-antecedent-inference-strategy))
	    (block 
	        (script-comment "`cut-with-single-formula' at (1)")
	        (contrapose "with(f:sets[place],f=f);")
	        extensionality
	        beta-reduce-insistently
	        simplify
	        (instantiate-existential ("g(x)"))
	        simplify
	        (block 
	            (script-comment "`instantiate-existential' at (0 1)")
	            (contrapose "with(p:prop,not(forsome(x_$0:place,p)));")
	            (instantiate-existential ("x"))))))))))


(def-theorem c%shadow-default 
    "forall(sigma:istate, f:[place->place], 
        #(c%shadow(sigma,f)) implies default(c%shadow(sigma,f))=lower(sigma,f))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally c%shadow)
        direct-inference
        (case-split-on-conditionals (0))
        (unfold-single-defined-constant-globally c%copy)
        (case-split-on-conditionals (0)))))


(def-theorem c%redirect-c%shadow-c%copy-defined 
    "forall(sigma:istate, g, h, f, h%plus:[place -> place], v:sets[place],
        h%plus=lambda (p:place, if(p in bound%place(sigma), p, h(p)))
        and 
        copy%fn(abstr(sigma), h%plus)
        and 
        ran(h) subseteq bound%place(sigma)
        and 
        dom(h) disj bound%place(sigma)
        and 
        ran(h) disj ran(default(sigma)) 
        and 
        bijective_on_q{g,dom{g},ran{h}} 
        and
        dom(g) disj bound%place(sigma)
        and 
        dom(g) disj dom(h)
        and
        dom(g) disj ran(h)
        and 
        dom(g) disj v
        and 
        f=lambda(p:place, if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))), p, #(g(p)), g(p),  ?place))
        implies 
        #(c%redirect(c%shadow(c%copy(sigma,lower(sigma,h%plus)),f),
                                  (inverse{g}) oo h)))"
    (theory places)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (unfold-single-defined-constant-globally c%redirect)
        beta-reduce-with-minor-premises
        (raise-conditional (0))
        direct-inference
        simplify
        (block 
            (script-comment "`direct-inference' at (1)")
            (contrapose "with(p:prop,not(p));")
            (unfold-single-defined-constant-globally c%redirect%fn)
            beta-reduce-with-minor-premises
            (apply-macete-with-minor-premises gamma-c%shadow-unchanged)
            (apply-macete-with-minor-premises gamma-c%copy-unchanged)
            (apply-macete-with-minor-premises tr%range-composition)
            (apply-macete-with-minor-premises tr%ran-of-inverse)
            (move-to-sibling 2)
            (apply-macete-with-minor-premises tr%injective-iff-injective-on-domain)
            (move-to-sibling 1)
            (apply-macete-with-minor-premises tr%injective-iff-injective-on-domain)
            (block 
	(script-comment "`apply-macete-with-minor-premises' at (0)")
	(apply-macete-with-minor-premises tr%domain-composition)
	direct-and-antecedent-inference-strategy
	(block 
	    (script-comment "`direct-and-antecedent-inference-strategy' at (0)")
	    extensionality
	    simplify
	    (instantiate-universal-antecedent "with(sigma:istate,g:[place,place],
    dom{g} disj bound%place(sigma));"
					        ("x_0"))
	    (block 
	        (script-comment "`instantiate-universal-antecedent' at (0 0 0 0)")
	        (apply-macete-with-minor-premises tr%rev%domain-membership-iff-defined)
	        direct-inference)
	    (block 
	        (script-comment "`instantiate-universal-antecedent' at (0 0 0 1)")
	        direct-inference
	        (contrapose "with(x_0:place,f:sets[place],not(x_0 in f));")
	        (apply-macete-with-minor-premises bound%place-characterization)
	        (apply-macete-with-minor-premises tr%first%entry-identity-in-set)
	        (move-to-ancestor 1)
	        beta-reduce-insistently
	        (apply-macete-with-minor-premises tr%first%entry-identity-in-set)))
	(block 
	    (script-comment "`direct-and-antecedent-inference-strategy' at (1)")
	    extensionality
	    beta-reduce-insistently
	    (raise-conditional (0 1 2))
	    (move-to-ancestor 1)
	    simplify
	    (instantiate-universal-antecedent "with(h,g:[place,place],dom{g} disj dom{h});"
					        ("x_0"))
	    (move-to-ancestor 1)
	    (apply-macete-with-minor-premises tr%rev%domain-membership-iff-defined)
	    direct-inference
	    (backchain "with(p:prop,p or p);"))
	(move-to-ancestor 4)
	(move-to-descendent (2))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1 0)")
	    (apply-macete-with-minor-premises tr%dom-of-inverse)
	    (backchain "with(h,g:[place,place],ran{g}=ran{h});"))
	(move-to-ancestor 4)
	(move-to-descendent (1))
	(weaken (1))
	(move-to-ancestor 6)
	(move-to-descendent (2))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1 0)")
	    (apply-macete-with-minor-premises tr%dom-of-inverse)
	    (backchain "with(h,g:[place,place],ran{g}=ran{h});"))
	(move-to-ancestor 6)
	(move-to-descendent (1))
	(weaken (0 1))
	(move-to-ancestor 8)
	(move-to-descendent (1))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1)")
	    (apply-macete-with-minor-premises c%shadow-c%copy-definedness)
	    auto-instantiate-existential)
	(move-to-ancestor 8)
	(move-to-descendent (2))
	(apply-macete-with-minor-premises c%copy-definedness)
	(move-to-ancestor 9)
	(move-to-descendent (1))
	(block 
	    (script-comment "`beta-reduce-with-minor-premises' at (1)")
	    (apply-macete-with-minor-premises c%shadow-c%copy-definedness)
	    auto-instantiate-existential)
	(move-to-ancestor 14)
	(move-to-descendent (1))
	(block 
	    (script-comment "`beta-reduce-with-minor-premises' at (1)")
	    (apply-macete-with-minor-premises c%shadow-c%copy-definedness)
	    auto-instantiate-existential)
	(block 
	    (script-comment "`direct-and-antecedent-inference-strategy' at (2 0 0)")
	    beta-reduce-insistently
	    simplify-insistently
	    beta-reduce-with-minor-premises
	    (move-to-sibling 1)
	    (apply-macete-with-minor-premises tr%rev%domain-membership-iff-defined)
	    (block 
	        (script-comment "`beta-reduce-with-minor-premises' at (0)")
	        (cut-with-single-formula "#(h(x_$3))")
	        (cut-with-single-formula "#(iota(y:place,g(y)=h(x_$3)))")
	        (move-to-sibling 1)
	        (block 
	            (script-comment "`cut-with-single-formula' at (1)")
	            (eliminate-iota 0)
	            (contrapose "with(h,g:[place,place],ran{g}=ran{h});")
	            extensionality
	            beta-reduce-insistently
	            (weaken (17 16 15 14 13 12 11 10 9 8 6 3 2 1))
	            simplify
	            (instantiate-existential ("h(x_$3)"))
	            (block 
		(script-comment "`instantiate-existential' at (0 0 0)")
		(contrapose "with(p:prop,forall(y%iota:place,p));")
		(antecedent-inference "with(p:prop,forsome(x_$1:place,p));")
		(instantiate-existential ("x_$1"))
		(backchain "with(g:[place,place],f:sets[place],injective_on_q{g,f});")
		(apply-macete-with-minor-premises tr%domain-membership-iff-defined)
		direct-and-antecedent-inference-strategy)
	            (block 
		(script-comment "`instantiate-existential' at (0 1)")
		simplify
		(instantiate-existential ("x_$3"))))
	        (block 
	            (script-comment "`cut-with-single-formula' at (0)")
	            (apply-macete-with-minor-premises c%shadow-default)
	            (unfold-single-defined-constant (0 2) lower)
	            (cut-with-single-formula "x_$3 in bound%place(c%copy(sigma,lower(sigma,h%plus)))")
	            (block 
		(script-comment "`cut-with-single-formula' at (0)")
		(cut-with-single-formula "not((inverse{g}(h(x_$3))) in bound%place(c%copy(sigma,lower(sigma,h%plus))))")
		(block 
		    (script-comment "`cut-with-single-formula' at (0)")
		    (raise-conditional (0))
		    (raise-conditional (0))
		    direct-and-antecedent-inference-strategy
		    (block 
		        (script-comment "`direct-and-antecedent-inference-strategy' at (0 0)")
		        (contrapose "with(p:place,f:sets[place],not(p in f));")
		        beta-reduce-insistently)
		    (block 
		        (script-comment "`direct-and-antecedent-inference-strategy' at (0 1)")
		        (apply-macete-with-minor-premises default-c%copy-un-bound%place)
		        (backchain "with(f:[place,place],f)
=with(f:sets[place],
      lambda(p:place,
          with(p:prop,
              if(with(p:place,p in f),
                  with(p:place,p),
                  with(p:prop,p),
                  with(p:place,p),
                  with(p:place,p)))));")
		        beta-reduce
		        (backchain "with(h:[place,place],f:sets[place],h%plus:[place,place],
    h%plus=lambda(p:place,if(p in f, p, h(p))));")
		        beta-reduce
		        (raise-conditional (0))
		        direct-inference
		        (raise-conditional (0))
		        direct-inference
		        (raise-conditional (0))
		        direct-inference
		        (move-to-sibling 1)
		        (block 
		            (script-comment "`direct-inference' at (1)")
		            (contrapose "with(p:place,not(#(p)));")
		            (eliminate-defined-iota-expression 0
                                                                                                                                  
							  a))
		        (eliminate-defined-iota-expression 0
                                                                                                                                  
						              b)))
		(block 
		    (script-comment "`cut-with-single-formula' at (1)")
		    beta-reduce-insistently
		    (cut-with-single-formula "iota(y:place,g(y)=h(x_$3)) in dom{g}")
		    (move-to-sibling 1)
		    (block 
		        (script-comment "`cut-with-single-formula' at (1)")
		        (apply-macete-with-minor-premises tr%domain-membership-iff-defined)
		        simplify
		        (eliminate-defined-iota-expression 0
                                                                                                                                  
						              a))
		    (block 
		        (script-comment "`cut-with-single-formula' at (0)")
		        (cut-with-single-formula "dom{g} disj bound%place(c%copy(sigma,lower(sigma,h%plus)))")
		        (block 
		            (script-comment "`cut-with-single-formula' at (0)")
		            (contrapose "with(f:[place,place],sigma:istate,g:[place,place],
    dom{g} disj bound%place(c%copy(sigma,f)));")
		            auto-instantiate-existential)
		        (block 
		            (script-comment "`cut-with-single-formula' at (1)")
		            insistent-direct-and-antecedent-inference-strategy
		            (apply-macete-with-minor-premises bound%place-characterization)
		            beta-reduce-insistently
		            (apply-macete-with-minor-premises tr%definedness-of-dangling-conditionals)
		            (apply-macete-with-minor-premises gamma-c%copy-unchanged)
		            (unfold-single-defined-constant-globally c%copy)
		            (apply-macete-with-minor-premises lower-is-c%copy%fn)
		            (raise-conditional (0))
		            direct-inference
		            (contrapose "with(x_$0:place,g:[place,place],x_$0 in dom{g});")
		            (antecedent-inference "with(p:prop,if_form(p, p, p));")
		            (contrapose "with(x_$0:place,
    #(first%entry(with(f:[place,place],f),
                                with(f:sets[place],f),
                                x_$0)));")
		            (apply-macete-with-minor-premises tr%first%entry-equation)
		            beta-reduce-insistently
		            (apply-macete-with-minor-premises default%make-istate)
		            (apply-macete-with-minor-premises tr%definedness-of-dangling-conditionals)
		            (contrapose "with(x_$0:place,g:[place,place],x_$0 in dom{g});")
		            (move-to-ancestor 1)
		            (raise-conditional (0))
		            (contrapose "with(x_$0:place,g:[place,place],x_$0 in dom{g});")
		            (antecedent-inference "with(p:prop,if_form(p, p, p));")
		            (block 
			(script-comment "`antecedent-inference' at (0)")
                                                                                                                                  
			(contrapose "with(w:word,#(w));")
                                                                                                                                  
			(move-to-ancestor 1)
                                                                                                                                  
			(contrapose "with(f:[place,word],g:[place,place],
    dom{g} inters dom{f}=empty_indic{place});")
                                                                                                                                  
			extensionality
                                                                                                                                  
			beta-reduce
                                                                                                                                  
			(instantiate-existential ("x_$0"))
                                                                                                                                  
			beta-reduce
                                                                                                                                  
			simplify)
		            (block 
			(script-comment "`antecedent-inference' at (1)")
                                                                                                                                  
			(contrapose "with(p:place,
    #(first%entry(with(f:[place,place],f),
                                with(f:sets[place],f),
                                p)));")
                                                                                                                                  
			(unfold-single-defined-constant (1) lower)
                                                                                                                                  
			(backchain "with(h:[place,place],f:sets[place],h%plus:[place,place],
    h%plus=lambda(p:place,if(p in f, p, h(p))));")
                                                                                                                                  
			(backchain "with(h:[place,place],f:sets[place],h%plus:[place,place],
    h%plus=lambda(p:place,if(p in f, p, h(p))));")
                                                                                                                                  
			beta-reduce
                                                                                                                                  
			(force-substitution "if(x_$0 in bound%place(sigma),
                                            default(sigma)(x_$0),
                                            x_$0 in bound%place(sigma),
                                            x_$0,
                                            h(x_$0))"
					        "h(x_$0)"
					        (0))
                                                                                                                                  
			(move-to-sibling 1)
                                                                                                                                  
			(block 
			    (script-comment "`force-substitution' at (1)")
			    (instantiate-universal-antecedent "with(sigma:istate,g:[place,place],
    dom{g} disj bound%place(sigma));"
							        ("x_$0"))
			    (weaken (15 14 13 12 11 10 9 8 6 5 4 3))
			    simplify)
                                                                                                                                  
			(block 
			    (script-comment "`force-substitution' at (0)")
			    (cut-with-single-formula "not(#(h(x_$0)))")
			    (block 
			        (script-comment "`cut-with-single-formula' at (0)")
			        (weaken (14 13 12 11 10 9 8 6 5 4 3))
			        simplify)
			    (block 
			        (script-comment "`cut-with-single-formula' at (1)")
			        (instantiate-universal-antecedent "with(h,g:[place,place],dom{g} disj dom{h});"
							            ("x_$0"))
			        (apply-macete-with-minor-premises tr%rev%domain-membership-iff-defined))))))))
	            (block 
		(script-comment "`cut-with-single-formula' at (1)")
		(apply-macete-with-minor-premises default-in-bound-place-implies-bound)
		(unfold-single-defined-constant (0)
                                                                                                                                  
						c%copy)
		(apply-macete-with-minor-premises lower-is-c%copy%fn)
		(raise-conditional (0))
		(apply-macete-with-minor-premises default%make-istate)
		(unfold-single-defined-constant (0)
                                                                                                                                  
						lower)
		(backchain "with(h:[place,place],f:sets[place],h%plus:[place,place],
    h%plus=lambda(p:place,if(p in f, p, h(p))));")
		beta-reduce
		(raise-conditional (0))
		direct-and-antecedent-inference-strategy
		(block 
		    (script-comment "`direct-and-antecedent-inference-strategy' at (0 0)")
		    (contrapose "with(x_$3:place,sigma:istate,x_$3 in bound%place(sigma));")
		    (instantiate-universal-antecedent "with(sigma:istate,h:[place,place],
    dom{h} disj bound%place(sigma));"
                                                                                                                                  
						        ("x_$3")))
		(block 
		    (script-comment "`direct-and-antecedent-inference-strategy' at (0 1)")
		    (raise-conditional (0))
		    direct-inference
		    (apply-macete-with-minor-premises bound%place%stability)
		    (apply-macete-with-minor-premises c%copy-definedness)
		    direct-inference
		    (instantiate-universal-antecedent "with(f:sets[place],f subseteq f);"
                                                                                                                                  
						        ("(h(x_$3))"))
		    (contrapose "with(x_$3:place,h:[place,place],not(h(x_$3) in ran{h}));")
		    (apply-macete-with-minor-premises tr%in-range-condition)))))))))))


(def-theorem case-1-mach-copy 
    "forall(sigma:istate, g, h, f, h%plus:[place -> place], v:sets[place],
    h%plus=lambda (p:place, if(p in bound%place(sigma), p, h(p)))
    and 
    copy%fn(abstr(sigma), h%plus)
    and 
    ran(h) subseteq bound%place(sigma)
    and 
    dom(h) disj bound%place(sigma)
    and 
    ran(h) disj ran(default(sigma)) 
    and 
    bijective_on_q{g,dom{g},ran{h}} 
    and
    dom(g) disj bound%place(sigma)
    and 
    dom(g) disj dom(h)
    and
    dom(g) disj ran(h)
    and 
    dom(g) disj v
    and 
    f=lambda(p:place, if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))), p, #(g(p)), g(p),  ?place))
    implies 
    user%eq(
        a%copy(abstr(sigma), h%plus), 
        abstr(c%redirect( 
                      c%shadow(c%copy(sigma,lower(sigma,h%plus)), f),
                      (inverse{g} oo h))),
        v))"
    (theory places)
    (proof
      (
        (apply-macete-with-minor-premises c%redirect-no-op)
        (move-to-sibling 1)
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (1)")
            (apply-macete-with-minor-premises c%redirect-c%shadow-c%copy-defined)
            auto-instantiate-existential)
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (0)")
            (apply-macete-with-minor-premises rev%copy-liveness)
            (apply-macete-with-minor-premises c%shadow-no-op)
            (unfold-single-defined-constant-globally shadow%set)
            beta-reduce-with-minor-premises
            (move-to-sibling 1)
            (apply-macete-with-minor-premises c%copy-definedness)
            (block 
	(script-comment "`beta-reduce-with-minor-premises' at (0)")
	direct-and-antecedent-inference-strategy
	insistent-direct-and-antecedent-inference-strategy
	simplify-insistently
	(backchain "with(f:[place,place],f)
=with(f:sets[place],
      lambda(p:place,
          with(p:prop,
              if(with(p:place,p in f),
                  with(p:place,p),
                  with(p:prop,p),
                  with(p:place,p),
                  with(p:place,p)))));")
	beta-reduce
	(raise-conditional (0))
	direct-and-antecedent-inference-strategy
	(contrapose "with(p:place,#(p));")
	(move-to-ancestor 1)
	(instantiate-universal-antecedent "with(v:sets[place],g:[place,place],dom{g} disj v);"
					    ("x"))
	(contrapose "with(x:place,g:[place,place],not(x in dom{g}));")
	simplify)))))


(def-constant h%ok 
    "lambda(h:[place->place], sigma:istate,    
          ran(h) subseteq bound%place(sigma)
          and 
          dom(h) disj bound%place(sigma))"
    (theory places))


(def-constant g%h%ok 
    "lambda(g,h:[place->place], sigma:istate,   
          bijective_on_q{g,dom{g},ran{h}} 
          and
          dom(g) disj bound%place(sigma)
          and
          dom(g) disj dom{default(sigma)}
          and 
          dom(g) disj dom(h))"
    (theory places))


(def-theorem g%h%ok-corollary 
    "forall(g,h:[place->place], sigma:istate,  
            h%ok(h, sigma) and g%h%ok(g,h, sigma)
            implies dom(g) disj ran(h))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally h%ok)
        (unfold-single-defined-constant-globally g%h%ok)
        insistent-direct-and-antecedent-inference-strategy
        (backchain "with(f:sets[place],f subseteq f);")
        (backchain "with(sigma:istate,g:[place,place],
    dom{g} disj bound%place(sigma));"))))


(def-constant snapshot%not%visible 
    "lambda(g:[place->place], v:sets[place], dom(g) disj v)"
    (theory places))


(def-theorem silly-conditional-simplification 
    "forall(sigma:istate, g, h, f, h%plus:[place -> place], v:sets[place], 
          lambda(p:place,
              if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))), p,
	    #(g(p)), g(p),  ?place))
        =lambda(p:place,
                if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))), p,  g(p))))"
    (theory places)
    (proof ((prove-by-logic-and-simplification 0))))


(def-theorem case-1-mach-copy-thm 
    "forall(sigma:istate, g, h, f, h%plus:[place -> place], v:sets[place],   
          h%ok(h,sigma)
          and 
          ran(h) disj ran(default(sigma)) 
          and 
          g%h%ok(g,h,sigma)
          and 
          snapshot%not%visible(g,v)
          and
          h%plus=lambda (p:place, if(p in bound%place(sigma), p, h(p)))
          and 
          copy%fn(abstr(sigma), h%plus)
          and 
          f=lambda(p:place, if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))), p, g(p)))
          implies 
          user%eq(
              a%copy(abstr(sigma), h%plus), 
              abstr(c%redirect( 
                            c%shadow(c%copy(sigma,lower(sigma,h%plus)), f),
                            (inverse{g} oo h))),
              v))"
    (theory places)
    (proof
      (
        (apply-macete-with-minor-premises case-1-mach-copy)
        (apply-macete-with-minor-premises g%h%ok-corollary)
        (apply-macete-with-minor-premises silly-conditional-simplification)
        (unfold-single-defined-constant-globally g%h%ok)
        (unfold-single-defined-constant-globally h%ok)
        (unfold-single-defined-constant-globally snapshot%not%visible)
        insistent-direct-and-antecedent-inference-strategy
        auto-instantiate-existential
        insistent-direct-and-antecedent-inference-strategy)))


(def-theorem g%h%ok-dom-g-unbound 
    "forall(sigma:istate, g,h:[place -> place], p:place, 
          h%ok(h,sigma)
          and 
          g%h%ok(g,h,sigma)
          and
          p in dom{g}
          implies 
          not p in bound%place(sigma))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally h%ok)
        (unfold-single-defined-constant-globally g%h%ok)
        direct-and-antecedent-inference-strategy
        simplify)))


(def-theorem g%h%ok-dom-g-disj-dom-h 
    "forall(sigma:istate, g,h:[place -> place], p:place,
          h%ok(h,sigma)
          and 
          g%h%ok(g,h,sigma)
          and 
          p in dom{g}
          implies 
          not p in dom{h})"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally g%h%ok)
        direct-and-antecedent-inference-strategy
        (backchain "with(h,g:[place,place],dom{g} disj dom{h});"))))


(def-theorem g%h%ok-dom-h-disj-dom-g 
    "forall(sigma:istate, g,h:[place -> place], p:place,
          h%ok(h,sigma)
          and 
          g%h%ok(g,h,sigma)
          and p in dom{h}
          implies 
          not p in dom{g})"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally g%h%ok)
        direct-and-antecedent-inference-strategy
        (backchain "with(h,g:[place,place],dom{g} disj dom{h});"))))


(def-theorem default-c%copy-lower 
    "forall(sigma:istate,h%plus:[place,place],
            default(c%copy(sigma,lower(sigma,h%plus)))
            =lower(sigma,h%plus))"
    (theory places)
    (usages rewrite)
    (proof
      (
        (unfold-single-defined-constant-globally c%copy)
        (apply-macete-with-minor-premises lower-is-c%copy%fn)
        simplify)))


(def-theorem lower-for-bound-place 
    "forall(sigma:istate, f:[place -> place], p:place, 
          p in bound%place(sigma) implies lower(sigma,f)(p)==default(sigma)(p))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally lower)
        simplify)))


(def-theorem lower-for-unbound-place 
    "forall(sigma:istate, f:[place -> place], p:place, 
          not(p in bound%place(sigma)) implies lower(sigma,f)(p)==f(p))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally lower)
        simplify)))


(def-theorem preferred-c%shadow-c%copy-definedness 
    "forall(f,h%plus:[place,place],g:[place,place],sigma:istate,h:[place,place],
    h%ok(h,sigma)
      and 
    g%h%ok(g,h,sigma)
      and 
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p)))
      and 
    copy%fn(abstr(sigma),h%plus)
      and 
    f
    =lambda(p:place,
          if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))),
              p,
              g(p)))
    implies
    #(c%shadow(c%copy(sigma,lower(sigma,h%plus)),f)))"
    (theory places)
    (proof
      (
        (apply-macete-with-minor-premises c%shadow-c%copy-definedness)
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises silly-conditional-simplification)
        (instantiate-existential ("g" "h"))
        (block 
            (script-comment "`instantiate-existential' at (0 2)")
            (incorporate-antecedent "with(sigma:istate,h:[place,place],h%ok(h,sigma));")
            (unfold-single-defined-constant-globally h%ok)
            direct-and-antecedent-inference-strategy)
        (block 
            (script-comment "`instantiate-existential' at (0 3)")
            (incorporate-antecedent "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
            (unfold-single-defined-constant-globally g%h%ok)
            direct-and-antecedent-inference-strategy))))


(def-theorem c%redirect-c%shadow-c%copy-definedness-case3 
    "forall(sigma:istate, g,h,f,h%plus,h_delta:[place -> place], v:sets[place],
          h%ok(h,sigma)
          and 
          g%h%ok(g,h,sigma)
          and 
          snapshot%not%visible(g,v)
          and
          h%plus=lambda (p:place, if(p in bound%place(sigma), p, h(p)))
          and 
          copy%fn(abstr(sigma), h%plus)
          and 
          f=lambda(p:place, 
	if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))), p, g(p)))
          implies 
          #(c%redirect(c%shadow(c%copy(sigma,lower(sigma,h%plus)),f),
                              (inverse{g}) oo (lower(sigma,h%plus)))))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally c%redirect)
        beta-reduce-with-minor-premises
        (move-to-sibling 1)
        (block 
            (script-comment "`beta-reduce-with-minor-premises' at (1)")
            (apply-macete-with-minor-premises preferred-c%shadow-c%copy-definedness)
            auto-instantiate-existential)
        (block 
            (script-comment "`beta-reduce-with-minor-premises' at (0)")
            simplify
            (unfold-single-defined-constant-globally c%redirect%fn)
            beta-reduce-with-minor-premises
            (move-to-sibling 1)
            (block 
	(script-comment "`beta-reduce-with-minor-premises' at (1)")
	(apply-macete-with-minor-premises preferred-c%shadow-c%copy-definedness)
	(instantiate-existential ("g" "h")))
            (block 
	(script-comment "`beta-reduce-with-minor-premises' at (0)")
	(apply-macete-with-minor-premises gamma-c%shadow-unchanged)
	(apply-macete-with-minor-premises gamma-c%copy-unchanged)
	(apply-macete-with-minor-premises c%shadow-default)
	(apply-macete-with-minor-premises tr%range-composition)
	(move-to-sibling 1)
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1)")
	    (weaken (0 1))
	    (apply-macete-with-minor-premises tr%dom-of-inverse)
	    (block 
	        (script-comment "`apply-macete-with-minor-premises' at (0)")
	        (apply-macete-with-minor-premises tr%subseteq-transitivity)
	        (instantiate-existential ("ran{h}"))
	        (block 
	            (script-comment "`instantiate-existential' at (0 0 0)")
	            (antecedent-inference "with(p:prop,p);")
	            (incorporate-antecedent "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
	            (unfold-single-defined-constant-globally g%h%ok)
	            direct-and-antecedent-inference-strategy
	            (backchain "with(h,g:[place,place],ran{g}=ran{h});"))
	        (block 
	            (script-comment "`instantiate-existential' at (0 0 1)")
	            (unfold-single-defined-constant-globally lower)
	            (backchain "with(p:prop,p and p and p and p and p and p);")
	            beta-reduce-insistently
	            simplify
	            direct-and-antecedent-inference-strategy
	            (instantiate-existential ("x"))
	            (raise-conditional (0))
	            direct-and-antecedent-inference-strategy
	            (antecedent-inference "with(p:prop,p and p and p and p and p and p);")
	            (contrapose "with(sigma:istate,h:[place,place],h%ok(h,sigma));")
	            (unfold-single-defined-constant-globally h%ok)
	            (contrapose "with(p,x_$3:place,x_$3=p);")
	            (auto-instantiate-universal-antecedent "with(h,g:[place,place],ran{g} subseteq ran{h});")
	            (antecedent-inference "with(p:prop,p and p);")
	            (auto-instantiate-universal-antecedent "with(sigma:istate,h:[place,place],
    dom{h} disj bound%place(sigma));")
	            (contrapose "with(x:place,f:sets[place],not(x in f));")
	            (apply-macete-with-minor-premises tr%domain-membership-iff-defined)))
	    (block 
	        (script-comment "`apply-macete-with-minor-premises' at (1)")
	        (antecedent-inference-strategy (0))
	        (apply-macete-with-minor-premises tr%injective-iff-injective-on-domain)
	        (incorporate-antecedent "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
	        (unfold-single-defined-constant-globally g%h%ok)
	        direct-and-antecedent-inference-strategy))
	(move-to-ancestor 2)
	(move-to-descendent (1))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1)")
	    (apply-macete-with-minor-premises preferred-c%shadow-c%copy-definedness)
	    (instantiate-existential ("g" "h")))
	(move-to-ancestor 4)
	(move-to-descendent (1))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1)")
	    (apply-macete-with-minor-premises preferred-c%shadow-c%copy-definedness)
	    (instantiate-existential ("g" "h")))
	(move-to-ancestor 4)
	(move-to-descendent (2))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (2)")
	    (apply-macete-with-minor-premises c%copy-definedness)
	    (antecedent-inference-strategy (1)))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (0)")
	    (apply-macete-with-minor-premises tr%ran-of-inverse)
	    (move-to-sibling 1)
	    (block 
	        (script-comment "`apply-macete-with-minor-premises' at (1)")
	        (antecedent-inference-strategy (2))
	        (incorporate-antecedent "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
	        (unfold-single-defined-constant-globally g%h%ok)
	        direct-and-antecedent-inference-strategy
	        (apply-macete-with-minor-premises tr%injective-iff-injective-on-domain))
	    (block 
	        (script-comment "`apply-macete-with-minor-premises' at (0)")
	        simplify-insistently
	        direct-and-antecedent-inference-strategy
	        (block 
	            (script-comment "`direct-and-antecedent-inference-strategy' at (0 0 0 0 0 0)")
	            extensionality
	            simplify-insistently
	            (incorporate-antecedent "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
	            (unfold-single-defined-constant-globally g%h%ok)
	            direct-and-antecedent-inference-strategy
	            (instantiate-universal-antecedent "with(sigma:istate,g:[place,place],
    dom{g} disj bound%place(sigma));"
                                                                                                                                  
						("x_0"))
	            (block 
		(script-comment "`instantiate-universal-antecedent' at (0 0 0)")
		(contrapose "with(p:prop,not(p));")
		(apply-macete-with-minor-premises tr%domain-membership-iff-defined))
	            (block 
		(script-comment "`instantiate-universal-antecedent' at (0 0 1)")
		(contrapose "with(p:prop,not(p));")
		(apply-macete-with-minor-premises bound%place-characterization)
		beta-reduce-insistently
		(apply-macete-with-minor-premises tr%first%entry-identity-in-set)))
	        (block 
	            (script-comment "`direct-and-antecedent-inference-strategy' at (0 0 1 0 0 0)")
	            extensionality
	            simplify-insistently
	            direct-and-antecedent-inference-strategy
	            (cut-with-single-formula "#(lower(sigma,h%plus)(x_0))")
	            (contrapose "with(x_0:place,h%plus:[place,place],sigma:istate,
    #(lower(sigma,h%plus)(x_0)));")
	            (unfold-single-defined-constant-globally lower)
	            (backchain "with(h:[place,place],sigma:istate,h%plus:[place,place],
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p))));")
	            beta-reduce
	            (raise-conditional (0))
	            (raise-conditional (0))
	            (contrapose "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
	            (unfold-single-defined-constant-globally g%h%ok)
	            (antecedent-inference-strategy (0))
	            (block 
		(script-comment "`antecedent-inference-strategy' at (0)")
		(contrapose "with(x_0:place,f:sets[place],x_0 in f);")
		(backchain "with(p:prop,p and p and p and p);")
		(move-to-ancestor 1)
		(antecedent-inference-strategy (0))
		(auto-instantiate-universal-antecedent "with(sigma:istate,g:[place,place],
    dom{g} disj bound%place(sigma));")
		(instantiate-universal-antecedent "with(sigma:istate,g:[place,place],
    dom{g} disj bound%place(sigma));"
                                                                                                                                  
						    ("x_0"))
		(contrapose "with(p:prop,not(p));")
		(apply-macete-with-minor-premises tr%domain-membership-iff-defined))
	            (block 
		(script-comment "`antecedent-inference-strategy' at (1 1)")
		(contrapose "with(x_0:place,h:[place,place],#(h(x_0)));")
		(antecedent-inference-strategy (0))
		(instantiate-universal-antecedent "with(h,g:[place,place],dom{g} disj dom{h});"
                                                                                                                                  
						    ("x_0"))
		(block 
		    (script-comment "`instantiate-universal-antecedent' at (0 0 0)")
		    (contrapose "with(x_0:place,g:[place,place],not(x_0 in dom{g}));")
		    (apply-macete-with-minor-premises tr%domain-membership-iff-defined))
		(block 
		    (script-comment "`instantiate-universal-antecedent' at (0 0 1)")
		    (contrapose "with(x_0:place,h:[place,place],not(x_0 in dom{h}));")
		    (apply-macete-with-minor-premises tr%domain-membership-iff-defined))))
	        (block 
	            (script-comment "`direct-and-antecedent-inference-strategy' at (0 0 2 0 0 0 0 0)")
	            (cut-with-single-formula "x_$3 in bound%place(c%copy(sigma,lower(sigma,h%plus)))")
	            (move-to-sibling 1)
	            (block 
		(script-comment "`cut-with-single-formula' at (1)")
		(cut-with-single-formula "#(lower(sigma,h%plus)(x_$3))")
		(move-to-sibling 1)
		simplify
		(block 
		    (script-comment "`cut-with-single-formula' at (0)")
		    (incorporate-antecedent "with(x_$3:place,h%plus:[place,place],sigma:istate,
    #(lower(sigma,h%plus)(x_$3)));")
		    (unfold-single-defined-constant (0)
                                                                                                                                  
						    lower)
		    (backchain "with(h:[place,place],sigma:istate,h%plus:[place,place],
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p))));")
		    beta-reduce
		    (raise-conditional (0))
		    (raise-conditional (0))
		    direct-and-antecedent-inference-strategy
		    (block 
		        (script-comment "`direct-and-antecedent-inference-strategy' at (0 0)")
		        (apply-macete-with-minor-premises bound%place%stability)
		        (apply-macete-with-minor-premises c%copy-definedness)
		        direct-and-antecedent-inference-strategy)
		    (block 
		        (script-comment "`direct-and-antecedent-inference-strategy' at (0 1 1)")
		        (apply-macete-with-minor-premises bound%place-characterization)
		        (block 
		            (script-comment "`apply-macete-with-minor-premises' at (0)")
		            beta-reduce-insistently
		            (apply-macete-with-minor-premises gamma-c%copy-unchanged)
		            (move-to-ancestor 1)
		            (apply-macete-with-minor-premises tr%definedness-of-dangling-conditionals)
		            (apply-macete-with-minor-premises tr%first%entry-equation)
		            (raise-conditional (0))
		            direct-and-antecedent-inference-strategy
		            (apply-macete-locally-with-minor-premises default-c%copy-lower
                                                                                                                                  
								(0)
                                                                                                                                  
								"default(c%copy(sigma,lower(sigma,h%plus)))
                                  (x_$3)")
		            (apply-macete-with-minor-premises lower-for-unbound-place)
		            (force-substitution "h%plus(x_$3)"
                                                                                                                                  
					    "if(x_$3 in bound%place(sigma), x_$3, h(x_$3))"
                                                                                                                                  
					    (0))
		            (block 
			(script-comment "`force-substitution' at (0)")
                                                                                                                                  
			simplify
                                                                                                                                  
			(move-to-ancestor 1)
                                                                                                                                  
			(raise-conditional (1))
                                                                                                                                  
			direct-and-antecedent-inference-strategy
                                                                                                                                  
			(cut-with-single-formula "h(x_$3) in bound%place(c%copy(sigma,lower(sigma,h%plus)))")
                                                                                                                                  
			(block 
			    (script-comment "`cut-with-single-formula' at (0)")
			    (incorporate-antecedent "with(p:place,f:sets[place],p in f);")
			    (apply-macete-with-minor-premises bound%place-characterization)
			    beta-reduce-insistently
			    (apply-macete-with-minor-premises tr%definedness-of-dangling-conditionals))
                                                                                                                                  
			(block 
			    (script-comment "`cut-with-single-formula' at (1)")
			    (incorporate-antecedent "with(sigma:istate,h:[place,place],h%ok(h,sigma));")
			    (unfold-single-defined-constant-globally h%ok)
			    direct-and-antecedent-inference-strategy
			    (instantiate-universal-antecedent "with(f:sets[place],f subseteq f);"
							        ("h(x_$3)"))
			    (block 
			        (script-comment "`instantiate-universal-antecedent' at (0 0 0)")
			        (contrapose "with(x_$3:place,h:[place,place],not(h(x_$3) in ran{h}));")
			        (apply-macete-with-minor-premises tr%in-range-condition))
			    (block 
			        (script-comment "`instantiate-universal-antecedent' at (0 0 1)")
			        (apply-macete-with-minor-premises bound%place%stability)
			        (apply-macete-with-minor-premises c%copy-definedness)
			        direct-and-antecedent-inference-strategy)))
		            (block 
			(script-comment "`force-substitution' at (1)")
                                                                                                                                  
			(backchain "with(h:[place,place],sigma:istate,h%plus:[place,place],
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p))));")
                                                                                                                                  
			beta-reduce))
		        (apply-macete-with-minor-premises c%copy-definedness))))
	            (block 
		(script-comment "`cut-with-single-formula' at (0)")
		(apply-macete-locally-with-minor-premises lower-for-bound-place
                                                                                                                                  
							    (0)
                                                                                                                                  
							    "lower(c%copy(sigma,lower(sigma,h%plus)),f)(x_$3)")
		(apply-macete-with-minor-premises default-c%copy-lower)
		(cut-with-single-formula "not((iota(y:place,g(y)=lower(sigma,h%plus)(x_$3))) in bound%place(c%copy(sigma,lower(sigma,h%plus))))")
		(block 
		    (script-comment "`cut-with-single-formula' at (0)")
		    (apply-macete-locally-with-minor-premises lower-for-unbound-place
                                                                                                                                  
							        (0)
                                                                                                                                  
							        "lower(c%copy(sigma,lower(sigma,h%plus)),f)
        (iota(y:place,g(y)=lower(sigma,h%plus)(x_$3)))")
		    (backchain "with(g:[place,place],sigma:istate,f:[place,place],
    f
    =lambda(p:place,
          if(p in bound%place(c%copy(sigma,f)), p, g(p))));")
		    beta-reduce-with-minor-premises
		    (raise-conditional (0))
		    direct-and-antecedent-inference-strategy
		    (cut-with-single-formula "#(iota(y:place,g(y)=lower(sigma,h%plus)(x_$3)))")
		    (eliminate-defined-iota-expression 0
                                                                                                                                  
						          a)
		    (block 
		        (script-comment "`beta-reduce-with-minor-premises' at (0 0 1 1)")
		        (cut-with-single-formula "#(lower(sigma,h%plus)(x_$3))")
		        (incorporate-antecedent "with(x_$3:place,f,g:[place,place],#(inverse{g}(f(x_$3))));")
		        simplify-insistently))
		(block 
		    (script-comment "`cut-with-single-formula' at (1)")
		    (cut-with-single-formula "#(lower(sigma,h%plus)(x_$3))")
		    (incorporate-antecedent "with(x_$3:place,f,g:[place,place],#(inverse{g}(f(x_$3))));")
		    simplify
		    direct-inference
		    (eliminate-defined-iota-expression 0
                                                                                                                                  
						          a)
		    (incorporate-antecedent "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
		    (unfold-single-defined-constant-globally g%h%ok)
		    direct-and-antecedent-inference-strategy
		    (instantiate-universal-antecedent "with(sigma:istate,g:[place,place],
    dom{g} disj bound%place(sigma));"
                                                                                                                                  
						        ("a"))
		    (block 
		        (script-comment "`instantiate-universal-antecedent' at (0 0 0)")
		        (contrapose "with(p:prop,not(p));")
		        (apply-macete-with-minor-premises tr%domain-membership-iff-defined))
		    (block 
		        (script-comment "`instantiate-universal-antecedent' at (0 0 1)")
		        (apply-macete-with-minor-premises bound%place-characterization)
		        beta-reduce-insistently
		        (apply-macete-with-minor-premises tr%definedness-of-dangling-conditionals)
		        (apply-macete-with-minor-premises tr%first%entry-equation)
		        simplify
		        direct-inference
		        (block 
		            (script-comment "`direct-inference' at (0)")
		            (contrapose "with(p:prop,not(p));")
		            (apply-macete-with-minor-premises bound%place-characterization)
		            beta-reduce-insistently
		            (apply-macete-with-minor-premises tr%first%entry-identity-in-set))
		        (block 
		            (script-comment "`direct-inference' at (1)")
		            (unfold-single-defined-constant (1)
                                                                                                                                  
						            lower)
		            (backchain "with(h:[place,place],sigma:istate,h%plus:[place,place],
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p))));")
		            (move-to-ancestor 1)
		            (force-substitution "h%plus(a)"
                                                                                                                                  
					    "if(a in bound%place(sigma), a, h(a))"
                                                                                                                                  
					    (0))
		            (block 
			(script-comment "`force-substitution' at (0)")
                                                                                                                                  
			simplify
                                                                                                                                  
			(instantiate-universal-antecedent "with(h,g:[place,place],dom{g} disj dom{h});"
							    ("a"))
                                                                                                                                  
			(block 
			    (script-comment "`instantiate-universal-antecedent' at (0 0 0)")
			    (contrapose "with(a:place,g:[place,place],not(a in dom{g}));")
			    (apply-macete-with-minor-premises tr%domain-membership-iff-defined))
                                                                                                                                  
			(block 
			    (script-comment "`instantiate-universal-antecedent' at (0 0 1)")
			    (contrapose "with(a:place,h:[place,place],not(a in dom{h}));")
			    (apply-macete-with-minor-premises tr%domain-membership-iff-defined)))
		            (block 
			(script-comment "`force-substitution' at (1)")
                                                                                                                                  
			(backchain "with(h:[place,place],sigma:istate,h%plus:[place,place],
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p))));")
                                                                                                                                  
			beta-reduce)))))))))))))


(def-theorem case-3-mach-copy-thm 
    "forall(sigma:istate, g,h,f,h%plus,h_delta:[place -> place], v:sets[place],
          h%ok(h,sigma)
          and 
          g%h%ok(g,h,sigma)
          and 
          snapshot%not%visible(g,v)
          and
          h%plus=lambda (p:place, if(p in bound%place(sigma), p, h(p)))
          and 
          copy%fn(abstr(sigma), h%plus)
          and 
          f=lambda(p:place, 
	if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))), p, g(p)))
          implies 
          user%eq(
              a%copy(abstr(sigma), h%plus), 
              abstr(c%redirect( 
                            c%shadow(c%copy(sigma,lower(sigma,h%plus)), f),
                            (inverse{g}) oo (lower(sigma,h%plus)))),
              v))"
    (theory places)
    (proof
      (
        (apply-macete-with-minor-premises c%redirect-no-op)
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (0)")
            (apply-macete-with-minor-premises rev%copy-liveness)
            (apply-macete-with-minor-premises c%shadow-no-op)
            (unfold-single-defined-constant-globally c%shadow)
            beta-reduce-with-minor-premises
            (move-to-sibling 1)
            (apply-macete-with-minor-premises c%copy-definedness)
            (block 
	(script-comment "`beta-reduce-with-minor-premises' at (0)")
	insistent-direct-and-antecedent-inference-strategy
	(block 
	    (script-comment "`insistent-direct-and-antecedent-inference-strategy' at (0 0 0 0 0
0)")
	    (unfold-single-defined-constant-globally shadow%set)
	    beta-reduce-with-minor-premises
	    (move-to-sibling 1)
	    (apply-macete-with-minor-premises c%copy-definedness)
	    (block 
	        (script-comment "`beta-reduce-with-minor-premises' at (0)")
	        simplify-insistently
	        (backchain "with(g:[place,place],sigma:istate,f:[place,place],
    f
    =lambda(p:place,
          if(p in bound%place(c%copy(sigma,f)), p, g(p))));")
	        (backchain "with(h:[place,place],sigma:istate,h%plus:[place,place],
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p))));")
	        (move-to-ancestor 1)
	        beta-reduce
	        (raise-conditional (0))
	        direct-and-antecedent-inference-strategy
	        (contrapose "with(v:sets[place],g:[place,place],
    snapshot%not%visible(g,v));")
	        (unfold-single-defined-constant-globally snapshot%not%visible)
	        simplify-insistently
	        auto-instantiate-existential))
	(block 
	    (script-comment "`insistent-direct-and-antecedent-inference-strategy' at (0 0 1 0)")
	    simplify
	    (apply-macete-with-minor-premises c%copy-definedness)
	    (apply-macete-with-minor-premises a%copy-definedness)
	    direct-inference
	    (apply-macete-with-minor-premises copy-liveness)
	    (unfold-single-defined-constant-globally copy%fn)
	    (force-substitution "dom{a%copy(abstr(sigma),h%plus)}"
			            "bound%place(c%copy(sigma,lower(sigma,h%plus)))"
			            (0 1))
	    (move-to-sibling 1)
	    (block 
	        (script-comment "`force-substitution' at (1)")
	        (apply-macete-with-minor-premises rev%copy-liveness)
	        (unfold-single-defined-constant-globally bound%place)
	        (move-to-ancestor 1)
	        extensionality
	        (block 
	            (script-comment "`extensionality' at (0)")
	            beta-reduce
	            simplify
	            (apply-macete-with-minor-premises tr%value-of-a-defined-indicator-application)
	            (block 
		(script-comment "`apply-macete-with-minor-premises' at (0)")
		(apply-macete-with-minor-premises bound%place-abstr-definedness)
		direct-and-antecedent-inference-strategy)
	            (apply-macete-with-minor-premises bound%place-abstr-definedness))
	        (block 
	            (script-comment "`extensionality' at (1)")
	            (apply-macete-with-minor-premises bound%place-characterization)
	            (apply-macete-with-minor-premises c%copy-definedness)))
	    (block 
	        (script-comment "`force-substitution' at (0)")
	        (backchain-repeatedly ("with(g,h%plus:[place,place],sigma:istate,f:[place,place],
    f
    =lambda(p:place,
          if(p in bound%place(c%copy(sigma,lower(sigma,h%plus))),
              p,
              g(p))));"))
	        beta-reduce
	        simplify
	        (backchain "with(g:[place,place],sigma:istate,f:[place,place],
    f
    =lambda(p:place,
          if(p in bound%place(c%copy(sigma,f)), p, g(p))));")
	        beta-reduce-insistently
	        simplify
	        (raise-conditional (0))
	        direct-and-antecedent-inference-strategy
	        simplify
	        (block 
	            (script-comment "`direct-and-antecedent-inference-strategy' at (0 0 0 1)")
	            (incorporate-antecedent "with(sigma:istate,h,g:[place,place],g%h%ok(g,h,sigma));")
	            (unfold-single-defined-constant-globally g%h%ok)
	            direct-and-antecedent-inference-strategy
	            (cut-with-single-formula "x_$0 in ran{h}")
	            (block 
		(script-comment "`cut-with-single-formula' at (0)")
		(incorporate-antecedent "with(sigma:istate,h:[place,place],h%ok(h,sigma));")
		(unfold-single-defined-constant-globally h%ok)
		direct-and-antecedent-inference-strategy
		(apply-macete-with-minor-premises bound%place%stability)
		(apply-macete-with-minor-premises c%copy-definedness)
		direct-inference
		(backchain "with(f:sets[place],f subseteq f);"))
	            (block 
		(script-comment "`cut-with-single-formula' at (1)")
		(backchain-backwards "with(h,g:[place,place],ran{g}=ran{h});")
		(backchain "with(p,x_$0:place,x_$0=p);")
		(apply-macete-with-minor-premises tr%in-range-condition)))))))
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (1)")
            (apply-macete-with-minor-premises c%redirect-c%shadow-c%copy-definedness-case3)
            auto-instantiate-existential))))


(def-constant g%h%ok_2 
    "lambda(g,h:[place->place], s:sets[place], sigma:istate,   
          bijective_on_q{g,s,ran{h}} 
          and
          dom(g) disj dom{gamma(sigma)}
          and 
          dom(g) disj dom(h)
          and 
          forall(p:place, #(g(p)) implies g(p)=default(sigma)(p)))"
    (theory places))


(def-theorem empty-inters-iff-disjoint 
    "forall(s_0,s_1:sets[ind_1], 
            s_0 inters s_1=empty_indic{ind_1}
              iff s_0 disj s_1)"
    (theory pure-generic-theory-1)
    (usages transportable-rewrite transportable-macete)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (block 
            (script-comment "`direct-and-antecedent-inference-strategy' at (0 0)")
            (contrapose "with(p:prop,p);")
            extensionality
            simplify-insistently)
        (block 
            (script-comment "`direct-and-antecedent-inference-strategy' at (0 1)")
            extensionality
            simplify-insistently))))


(def-theorem lower-h%plus 
    "forall(sigma:istate,h,h%plus:[place,place],
        h%plus
        =lambda(p:place,if(p in bound%place(sigma), p, h(p)))
          implies 
        lower(sigma,h%plus)=lower(sigma,h))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally lower)
        direct-and-antecedent-inference-strategy
        (backchain "with(p:prop,p);")
        extensionality
        beta-reduce
        direct-inference
        (case-split-on-conditionals (0)))))


(def-theorem g%h%ok_2-etc-implies-bound 
    "forall(sigma:istate,g,h:[place,place],s:sets[place],a:place,
    g%h%ok_2(g,h,s,sigma) and h%ok(h,sigma) and a in s
      implies 
    a in bound%place(sigma))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally g%h%ok_2)
        (unfold-single-defined-constant-globally h%ok)
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "default(sigma)(a) in bound%place(sigma)")
        (apply-macete-with-minor-premises default-in-bound-place-implies-bound)
        (block 
            (script-comment "`cut-with-single-formula' at (1)")
            (backchain-backwards "forall(p:place,#(p) implies p=p);")
            direct-inference
            (block 
	(script-comment "`direct-inference' at (0)")
	(apply-macete-with-minor-premises tr%rev%domain-membership-iff-defined)
	simplify)
            (block 
	(script-comment "`direct-inference' at (1)")
	(cut-with-single-formula "g(a) in ran{g}")
	(move-to-sibling 1)
	(apply-macete-with-minor-premises tr%in-range-condition)
	(block 
	    (script-comment "`cut-with-single-formula' at (0)")
	    (apply-macete-with-minor-premises tr%element-of-a-subset-is-an-element)
	    auto-instantiate-existential
	    (backchain "with(h,g:[place,place],ran{g}=ran{h});")))))))


(def-theorem g%h%ok_2-disjointness 
    "forall(sigma:istate, g,h:[place -> place], s:sets[place], 
    g%h%ok_2(g,h,s,sigma) implies dom{g} disj dom{h})"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally g%h%ok_2)
        direct-and-antecedent-inference-strategy)))


(def-theorem h%ok-implies-dom-unbound 
    "forall(sigma:istate, h:[place -> place], a:place,
    h%ok(h,sigma) and a in dom{h} implies not(a in bound%place(sigma)))"
    (theory places)
    (proof
      (
        (unfold-single-defined-constant-globally h%ok)
        simplify
        (move-to-ancestor 1)
        direct-and-antecedent-inference-strategy
        (backchain "with(f:sets[place],f disj f);"))))


(def-theorem g%h%ok_2-iota-definedness 
    "forall(sigma:istate, g,h:[place -> place], s:sets[place], x:place, 
    g%h%ok_2(g,h,s,sigma) and x in dom{h} implies #(iota(y:place,g(y)=h(x))))"
    (theory places)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (incorporate-antecedent "with(sigma:istate,s:sets[place],h,g:[place,place],
    g%h%ok_2(g,h,s,sigma));")
        (unfold-single-defined-constant-globally g%h%ok_2)
        direct-and-antecedent-inference-strategy
        (cut-with-single-formula "#(h(x))")
        (move-to-sibling 1)
        (apply-macete-with-minor-premises tr%rev%domain-membership-iff-defined)
        (block 
            (script-comment "`cut-with-single-formula' at (0)")
            (eliminate-iota 0)
            (contrapose "with(h,g:[place,place],ran{g}=ran{h});")
            extensionality
            beta-reduce-insistently
            (instantiate-existential ("h(x)"))
            simplify
            direct-inference
            (move-to-sibling 1)
            (instantiate-existential ("x"))
            (block 
	(script-comment "`direct-inference' at (0)")
	(contrapose "with(p:prop,forall(y%iota:place,p or p or p));")
	(antecedent-inference-strategy (0 1))
	(instantiate-existential ("x_$1"))
	(backchain "with(g:[place,place],s:sets[place],injective_on_q{g,s});")
	(force-substitution "s" "dom{g}" (0 1))
	(apply-macete-with-minor-premises tr%domain-membership-iff-defined)
	simplify)))))


(def-theorem case-2-mach-copy-thm 
    "forall(sigma:istate,g,h,h%plus:[place,place],s,v:sets[place],
    h%ok(h,sigma)
      and 
    g%h%ok_2(g,h,s,sigma)
      and 
    snapshot%not%visible(g,v)
      and 
    h%plus
    =lambda(p:place,if(p in bound%place(sigma), p, h(p)))
      and 
    copy%fn(abstr(sigma),h%plus)
      implies 
    user%eq(a%copy(abstr(sigma),h%plus),
                    abstr(c%redirect(c%copy(sigma,lower(sigma,h%plus)),
                                                      (inverse{g}) oo h)),
                    v))"
    (theory places)
    (proof
      (
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises c%redirect-no-op)
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (0)")
            (apply-macete-with-minor-premises copy-liveness)
            (unfold-single-defined-constant-globally user%eq))
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (1)")
            (unfold-single-defined-constant-globally c%redirect)
            simplify
            (unfold-single-defined-constant-globally c%redirect%fn)
            (apply-macete-with-minor-premises tr%range-composition)
            (apply-macete-with-minor-premises tr%ran-of-inverse)
            (apply-macete-with-minor-premises gamma-c%copy-unchanged)
            (apply-macete-with-minor-premises tr%domain-composition)
            (move-to-ancestor 4)
            (move-to-descendent (1))
            (block 
	(script-comment "`apply-macete-with-minor-premises' at (1)")
	(weaken (0 1))
	(move-to-ancestor 2)
	(move-to-descendent (0 1))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1)")
	    (weaken (0 1))
	    (move-to-ancestor 2)
	    (move-to-descendent (0 0 1))
	    (weaken (1))
	    (move-to-ancestor 2)
	    (move-to-descendent (0))
	    (block 
	        (script-comment "`apply-macete-with-minor-premises' at (0)")
	        (apply-macete-locally-with-minor-premises tr%intersection-commutativity
                                                                                                                                  
						            (0)
                                                                                                                                  
						            "dom{h} inters dom{g}=empty_indic{place}")
	        (apply-macete-with-minor-premises tr%empty-inters-iff-disjoint)
	        (incorporate-antecedent "with(sigma:istate,s:sets[place],h,g:[place,place],
    g%h%ok_2(g,h,s,sigma));")
	        (unfold-single-defined-constant-globally g%h%ok_2)
	        direct-and-antecedent-inference-strategy
	        (apply-macete-with-minor-premises default-c%copy-lower)
	        (instantiate-theorem lower-h%plus
				  ("sigma" "h" "h%plus"))
	        (backchain-repeatedly ("with(h,h%plus:[place,place],sigma:istate,
    lower(sigma,h%plus)=lower(sigma,h));"))
	        (unfold-single-defined-constant-globally lower)
	        (instantiate-theorem h%ok-implies-dom-unbound
				  ("sigma" "h" "x_$3"))
	        (instantiate-theorem g%h%ok_2-iota-definedness
				  ("sigma" "g" "h" "s" "x_$3"))
	        (block 
	            (script-comment "`instantiate-theorem' at (0 0 0)")
	            (contrapose "with(sigma:istate,s:sets[place],h,g:[place,place],
    not(g%h%ok_2(g,h,s,sigma)));")
	            (unfold-single-defined-constant-globally g%h%ok_2)
	            direct-and-antecedent-inference-strategy
	            insistent-direct-and-antecedent-inference-strategy)
	        (block 
	            (script-comment "`instantiate-theorem' at (0 1)")
	            simplify-insistently
	            beta-reduce-insistently
	            (cut-with-single-formula "#(h(x_$3))")
	            (move-to-sibling 1)
	            (apply-macete-with-minor-premises tr%rev%domain-membership-iff-defined)
	            (block 
		(script-comment "`cut-with-single-formula' at (0)")
		beta-reduce-insistently
		(apply-macete-with-minor-premises g%h%ok_2-etc-implies-bound)
		(instantiate-theorem g%h%ok_2-etc-implies-bound
				          ("sigma" "g"
                                                                                                                                  
					            "h"
                                                                                                                                  
					            "s"
                                                                                                                                  
					            "iota(y:place,g(y)=h(x_$3))"))
		(block 
		    (script-comment "`instantiate-theorem' at (0 0 0)")
		    (contrapose "with(sigma:istate,s:sets[place],h,g:[place,place],
    not(g%h%ok_2(g,h,s,sigma)));")
		    (unfold-single-defined-constant-globally g%h%ok_2)
		    insistent-direct-and-antecedent-inference-strategy)
		(block 
		    (script-comment "`instantiate-theorem' at (0 0 2)")
		    (contrapose "with(p:prop,s:sets[place],not(iota(y:place,p) in s));")
		    (eliminate-defined-iota-expression 0
                                                                                                                                  
						          b)
		    (backchain-backwards "with(s:sets[place],g:[place,place],dom{g}=s);")
		    (apply-macete-with-minor-premises tr%domain-membership-iff-defined))
		(block 
		    (script-comment "`instantiate-theorem' at (0 1)")
		    (raise-conditional (0))
		    direct-and-antecedent-inference-strategy
		    (backchain-backwards "with(p:prop,forall(p:place,with(p:prop,p implies p)));")
		    direct-inference
		    (eliminate-defined-iota-expression 0
                                                                                                                                  
						          c)
		    (eliminate-defined-iota-expression 0
                                                                                                                                  
						          d)))))
	    (block 
	        (script-comment "`apply-macete-with-minor-premises' at (1 0)")
	        (apply-macete-with-minor-premises tr%dom-of-inverse)
	        (block 
	            (script-comment "`apply-macete-with-minor-premises' at (0)")
	            (incorporate-antecedent "with(sigma:istate,s:sets[place],h,g:[place,place],
    g%h%ok_2(g,h,s,sigma));")
	            (unfold-single-defined-constant-globally g%h%ok_2)
	            direct-and-antecedent-inference-strategy
	            (backchain "with(h,g:[place,place],ran{g}=ran{h});"))
	        (block 
	            (script-comment "`apply-macete-with-minor-premises' at (1)")
	            (weaken (0 1))
	            (incorporate-antecedent "with(sigma:istate,s:sets[place],h,g:[place,place],
    g%h%ok_2(g,h,s,sigma));")
	            (unfold-single-defined-constant-globally g%h%ok_2)
	            direct-and-antecedent-inference-strategy
	            (apply-macete-with-minor-premises tr%injective-iff-injective-on-domain)
	            (backchain "with(s:sets[place],g:[place,place],dom{g}=s);"))))
	(block 
	    (script-comment "`apply-macete-with-minor-premises' at (1 0)")
	    (apply-macete-with-minor-premises tr%dom-of-inverse)
	    (incorporate-antecedent "with(sigma:istate,s:sets[place],h,g:[place,place],
    g%h%ok_2(g,h,s,sigma));")
	    (unfold-single-defined-constant-globally g%h%ok_2)
	    direct-and-antecedent-inference-strategy
	    (backchain "with(h,g:[place,place],ran{g}=ran{h});")))))))