(def-theorem add-one-typical-case 
    "forall(x:zz_mod, x<modulus-1 implies +_mod(x,1)=x+1)"
    (theory arithmetic-mod-n)
    (proof
      (
        (unfold-single-defined-constant (0) +_mod)
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises mod-characterization)
        simplify
        (cut-with-single-formula "#(x,zz_mod)")
        (incorporate-antecedent "with(x:zz_mod,#(x,zz_mod));")
        (apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
        (unfold-single-defined-constant (0) divides)
        simplify
        )))


(def-theorem add-one-special-case 
    "forall(x:zz_mod, +_mod(modulus-1,1)=0)"
    (theory arithmetic-mod-n)
    (proof
      (
        
        (unfold-single-defined-constant (0) +_mod)
        simplify
        (apply-macete-with-minor-premises mod-characterization)
        (unfold-single-defined-constant (0) divides)
        simplify
        )))

(def-theorem ()
    "#(-_mod(1))"
    (theory arithmetic-mod-n)
    lemma
    (proof
      (
        (apply-macete-with-minor-premises -_mod-computation-non-zero)
        )))


(def-constant neg_1 
    "-_mod(1)"
    (theory arithmetic-mod-n))


(def-theorem add-neg_1-typical-case 
    "forall(x:zz_mod, not(x=0) implies +_mod(x,neg_1)=x-1)"
    (theory arithmetic-mod-n)
    (proof
      (
        (unfold-single-defined-constant (0) neg_1)
        (apply-macete-with-minor-premises -_mod-computation-non-zero)
        direct-and-antecedent-inference-strategy
        (apply-macete-with-minor-premises +_mod-characterization)
        (move-to-sibling 1)
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (1)")
            (apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
            (cut-with-single-formula "#(x,zz_mod)")
            (incorporate-antecedent "with(x:zz_mod,#(x,zz_mod));")
            (apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
            simplify)
        (block 
            (script-comment "`apply-macete-with-minor-premises' at (0)")
            direct-and-antecedent-inference-strategy
            (block 
	(script-comment "`direct-and-antecedent-inference-strategy' at (0)")
	(cut-with-single-formula "#(x,zz_mod)")
	(incorporate-antecedent "with(x:zz_mod,#(x,zz_mod));")
	(apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
	simplify)
            (block 
	(script-comment "`direct-and-antecedent-inference-strategy' at (1)")
	(weaken (0))
	simplify
	(cut-with-single-formula "#(x,zz_mod)")
	(incorporate-antecedent "with(x:zz_mod,#(x,zz_mod));")
	(apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
	simplify)
            (block 
	(script-comment "`direct-and-antecedent-inference-strategy' at (2)")
	(unfold-single-defined-constant (0) congruent)
	simplify
	(apply-macete-with-minor-premises multiplication-preserves-divisibility)
	(apply-macete-with-minor-premises self-divisibility)
	simplify))
        )))


(def-theorem add-neg_1-0 
    "forall(x:zz_mod, +_mod(0,neg_1)=modulus-1)"
    (theory arithmetic-mod-n)
    (proof
      (
        (unfold-single-defined-constant (0) neg_1)
        (apply-macete-with-minor-premises -_mod-computation-non-zero)
        (apply-macete-with-minor-premises +_mod-characterization)
        (unfold-single-defined-constant (0) congruent)
        (unfold-single-defined-constant (0) divides)
        simplify
        )))
        


(def-theory arithmetic-mod-5 
    (component-theories arithmetic-mod-n)
    (axioms
      (modular-value "modulus=5")))


(def-theorem example-op 
    "+_mod(2,3)=0"
    (theory arithmetic-mod-5)
    (proof
      (
        (unfold-single-defined-constant (0) +_mod)
        (unfold-single-defined-constant (0) mod)
        (apply-macete-with-minor-premises modular-value)
        beta-reduce-with-minor-premises
        simplify
        (block 
            (script-comment "node added by `beta-reduce-with-minor-premises' at (1)")
            (apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
            (apply-macete-with-minor-premises modular-value)
            simplify)
        (block 
            (script-comment "node added by `beta-reduce-with-minor-premises' at (2)")
            (apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
            (apply-macete-with-minor-premises modular-value)
            simplify)
        )))

(def-script mod-plus-compute 0
    
    (
      (unfold-single-defined-constant (0) +_mod)
      (unfold-single-defined-constant (0) mod)
      (apply-macete-with-minor-premises modular-value)
      beta-reduce-with-minor-premises
      simplify
      (block 
          (script-comment "node added by `beta-reduce-with-minor-premises' at (1)")
          (apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
          (apply-macete-with-minor-premises modular-value)
          simplify)
      (block 
          (script-comment "node added by `beta-reduce-with-minor-premises' at (2)")
          (apply-macete-with-minor-premises zz_mod-defining-axiom_arithmetic-mod-n)
          (apply-macete-with-minor-premises modular-value)
          simplify)
      ))


(def-theorem example-op-1 
    "+_mod(2,4)=1"
    (theory arithmetic-mod-5)
    (proof
      (
        mod-plus-compute
        )))