Theory M3_Polynomial

theory M3_Polynomial
  imports Pi_Relations Polynomials.MPoly_Type_Univariate
          "../MPoly_Utils/Poly_Extract" "../MPoly_Utils/Poly_Degree"
begin

subsection ‹The Matiyasevich-Robinson-Polynomial›

text ‹For any appropriately typed function fn, we introduce the syntax
        fn π ≡ fn A1 A2 A3 S T R n›, as well as (λπ. e) ≡ (λA1 A2 A3 S T R n. e)›.›

syntax "pi" :: "(int  int  int  int  int  int  int  int)  int" ("_ π" [1000] 1000)
syntax "pi_fn" :: "(int  int  int  int  int  int  int  int)  int" ("λπ. _" [0] 0)
parse_translation [
    (
      syntax_const‹pi›,
      fn ctxt => fn args =>
        list_comb (
          args |> hd,
          ["A1", "A2", "A3", "S", "T", "R", "n"] |> map (fn name => Free (name, @{typ int}))
        )
    ),
    (
      syntax_const‹pi_fn›,
      fn ctxt => fn args =>
        ["A1", "A2", "A3", "S", "T", "R", "n"]
          |> List.foldr (fn (name, r) => Abs (name, @{typ int}, r)) (args |> hd)
    )
  ]

locale section5 = section5_given + section5_variables
begin

definition X0 :: "int  int  int  int  int  int  int  int" where
  "X0 π = 1 + A1^2 + A2^2 + A3^2"
definition I0 :: "int  int  int  int  int  int  int  int" where
  "I0 π = (X0 π)^3"
definition U0 :: "int  int  int  int  int  int  int  int" where
  "U0 π = S^2 * (2 * R - 1)"
definition V0 :: "int  int  int  int  int  int  int  int" where
  "V0 π = S^2 * n + T^2"

poly_extract X0
poly_extract I0
poly_extract U0
poly_extract V0


definition M3 :: "int  int  int  int  int  int  int  int" where
  "M3 A1 A2 A3 S T R n =
    (
      ((
        (
          (
            ((V0 π) - (U0 π) * (I0 π) - (U0 π) * T^2)^2
              + (U0 π)^2 * A1
              + (U0 π)^2 * A2 * (X0 π)^2
              - (U0 π)^2 * A3 * (X0 π)^4
          )
        )^2 
          + 4 * (U0 π)^2 * (V0 π - U0 π * I0 π - U0 π * T^2)^2 * A1
          - 4 * (U0 π)^2 * (V0 π - U0 π * I0 π - U0 π * T^2)^2 * A2 * (X0 π)^2
          - 4 * (U0 π)^4 * A1 * A2 * (X0 π)^2
      )^2)
        - A1 * (U0 π * (
          4
            * (V0 π - U0 π * I0 π - U0 π * T^2)
            * (
              ((V0 π - U0 π * I0 π - U0 π * T^2))^2
                + (U0 π)^2 * A1
                + (U0 π)^2 * A2 * (X0 π)^2
                - (U0 π)^2 * A3 * (X0 π)^4
              )
                - 8
                  * (U0 π)^2
                  * (V0 π - U0 π * I0 π - U0 π * T^2)
                  * A2
                  * (X0 π)^2
        ))^2
    )
"

poly_extract M3

end

end