src/Pure/Proof/proof_rewrite_rules.ML
changeset 56245 84fc7dfa3cd4
parent 56244 3298b7a2795a
child 59582 0fbed69ff081
equal deleted inserted replaced
56244:3298b7a2795a 56245:84fc7dfa3cd4
    61         SOME (tg %> B %% (equal_elim_axm %> A %> B %%
    61         SOME (tg %> B %% (equal_elim_axm %> A %> B %%
    62           (symmetric_axm % ?? B % ?? A %% prf1) %% prf2))
    62           (symmetric_axm % ?? B % ?? A %% prf1) %% prf2))
    63 
    63 
    64       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
    64       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
    65         (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
    65         (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
    66           (PAxm ("Pure.combination", _, _) % SOME (Const ("==>", _)) % _ % _ % _ %%
    66           (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.imp", _)) % _ % _ % _ %%
    67              (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2)) =
    67              (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2)) =
    68         let
    68         let
    69           val _ $ A $ C = Envir.beta_norm X;
    69           val _ $ A $ C = Envir.beta_norm X;
    70           val _ $ B $ D = Envir.beta_norm Y
    70           val _ $ B $ D = Envir.beta_norm Y
    71         in SOME (AbsP ("H1", ?? X, AbsP ("H2", ?? B,
    71         in SOME (AbsP ("H1", ?? X, AbsP ("H2", ?? B,
    76         end
    76         end
    77 
    77 
    78       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
    78       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
    79         (PAxm ("Pure.symmetric", _, _) % _ % _ %%
    79         (PAxm ("Pure.symmetric", _, _) % _ % _ %%
    80           (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
    80           (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
    81             (PAxm ("Pure.combination", _, _) % SOME (Const ("==>", _)) % _ % _ % _ %%
    81             (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.imp", _)) % _ % _ % _ %%
    82                (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2))) =
    82                (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2))) =
    83         let
    83         let
    84           val _ $ A $ C = Envir.beta_norm Y;
    84           val _ $ A $ C = Envir.beta_norm Y;
    85           val _ $ B $ D = Envir.beta_norm X
    85           val _ $ B $ D = Envir.beta_norm X
    86         in SOME (AbsP ("H1", ?? X, AbsP ("H2", ?? A,
    86         in SOME (AbsP ("H1", ?? X, AbsP ("H2", ?? A,
    89               (PBound 1 %%
    89               (PBound 1 %%
    90                 (equal_elim_axm %> A %> B %% Proofterm.incr_pboundvars 2 0 prf1 %% PBound 0)))))
    90                 (equal_elim_axm %> A %> B %% Proofterm.incr_pboundvars 2 0 prf1 %% PBound 0)))))
    91         end
    91         end
    92 
    92 
    93       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
    93       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
    94         (PAxm ("Pure.combination", _, _) % SOME (Const ("all", _)) % _ % _ % _ %%
    94         (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.all", _)) % _ % _ % _ %%
    95           (PAxm ("Pure.reflexive", _, _) % _) %%
    95           (PAxm ("Pure.reflexive", _, _) % _) %%
    96             (PAxm ("Pure.abstract_rule", _, _) % _ % _ %% prf))) =
    96             (PAxm ("Pure.abstract_rule", _, _) % _ % _ %% prf))) =
    97         let
    97         let
    98           val Const (_, T) $ P = Envir.beta_norm X;
    98           val Const (_, T) $ P = Envir.beta_norm X;
    99           val _ $ Q = Envir.beta_norm Y;
    99           val _ $ Q = Envir.beta_norm Y;
   102               (Proofterm.incr_pboundvars 1 1 prf %> Bound 0) %% (PBound 0 %> Bound 0))))
   102               (Proofterm.incr_pboundvars 1 1 prf %> Bound 0) %% (PBound 0 %> Bound 0))))
   103         end
   103         end
   104 
   104 
   105       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
   105       | rew' (PAxm ("Pure.equal_elim", _, _) % SOME X % SOME Y %%
   106         (PAxm ("Pure.symmetric", _, _) % _ % _ %%        
   106         (PAxm ("Pure.symmetric", _, _) % _ % _ %%        
   107           (PAxm ("Pure.combination", _, _) % SOME (Const ("all", _)) % _ % _ % _ %%
   107           (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.all", _)) % _ % _ % _ %%
   108             (PAxm ("Pure.reflexive", _, _) % _) %%
   108             (PAxm ("Pure.reflexive", _, _) % _) %%
   109               (PAxm ("Pure.abstract_rule", _, _) % _ % _ %% prf)))) =
   109               (PAxm ("Pure.abstract_rule", _, _) % _ % _ %% prf)))) =
   110         let
   110         let
   111           val Const (_, T) $ P = Envir.beta_norm X;
   111           val Const (_, T) $ P = Envir.beta_norm X;
   112           val _ $ Q = Envir.beta_norm Y;
   112           val _ $ Q = Envir.beta_norm Y;
   138         (PAxm ("Pure.symmetric", _, _) % _ % _ %% prf)) = SOME prf
   138         (PAxm ("Pure.symmetric", _, _) % _ % _ %% prf)) = SOME prf
   139 
   139 
   140       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   140       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   141         (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ A $ C) % SOME (_ $ B $ D) %%
   141         (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ A $ C) % SOME (_ $ B $ D) %%
   142           (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   142           (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   143             (PAxm ("Pure.combination", _, _) % SOME (Const ("==", _)) % _ % _ % _ %%
   143             (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.eq", _)) % _ % _ % _ %%
   144               (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2) %% prf3) %% prf4) =
   144               (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2) %% prf3) %% prf4) =
   145           SOME (equal_elim_axm %> C %> D %% prf2 %%
   145           SOME (equal_elim_axm %> C %> D %% prf2 %%
   146             (equal_elim_axm %> A %> C %% prf3 %%
   146             (equal_elim_axm %> A %> C %% prf3 %%
   147               (equal_elim_axm %> B %> A %% (symmetric_axm % ?? A % ?? B %% prf1) %% prf4)))
   147               (equal_elim_axm %> B %> A %% (symmetric_axm % ?? A % ?? B %% prf1) %% prf4)))
   148 
   148 
   149       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   149       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   150         (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   150         (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   151           (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ A $ C) % SOME (_ $ B $ D) %%
   151           (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ A $ C) % SOME (_ $ B $ D) %%
   152             (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   152             (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   153               (PAxm ("Pure.combination", _, _) % SOME (Const ("==", _)) % _ % _ % _ %%
   153               (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.eq", _)) % _ % _ % _ %%
   154                 (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2) %% prf3)) %% prf4) =
   154                 (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2) %% prf3)) %% prf4) =
   155           SOME (equal_elim_axm %> A %> B %% prf1 %%
   155           SOME (equal_elim_axm %> A %> B %% prf1 %%
   156             (equal_elim_axm %> C %> A %% (symmetric_axm % ?? A % ?? C %% prf3) %%
   156             (equal_elim_axm %> C %> A %% (symmetric_axm % ?? A % ?? C %% prf3) %%
   157               (equal_elim_axm %> D %> C %% (symmetric_axm % ?? C % ?? D %% prf2) %% prf4)))
   157               (equal_elim_axm %> D %> C %% (symmetric_axm % ?? C % ?? D %% prf2) %% prf4)))
   158 
   158 
   159       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   159       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   160         (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ B $ D) % SOME (_ $ A $ C) %%
   160         (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ B $ D) % SOME (_ $ A $ C) %%
   161           (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   161           (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   162             (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   162             (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   163               (PAxm ("Pure.combination", _, _) % SOME (Const ("==", _)) % _ % _ % _ %%
   163               (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.eq", _)) % _ % _ % _ %%
   164                 (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2)) %% prf3) %% prf4) =
   164                 (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2)) %% prf3) %% prf4) =
   165           SOME (equal_elim_axm %> D %> C %% (symmetric_axm % ?? C % ?? D %% prf2) %%
   165           SOME (equal_elim_axm %> D %> C %% (symmetric_axm % ?? C % ?? D %% prf2) %%
   166             (equal_elim_axm %> B %> D %% prf3 %%
   166             (equal_elim_axm %> B %> D %% prf3 %%
   167               (equal_elim_axm %> A %> B %% prf1 %% prf4)))
   167               (equal_elim_axm %> A %> B %% prf1 %% prf4)))
   168 
   168 
   169       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   169       | rew' (PAxm ("Pure.equal_elim", _, _) % _ % _ %%
   170         (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   170         (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   171           (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ B $ D) % SOME (_ $ A $ C) %%
   171           (PAxm ("Pure.equal_elim", _, _) % SOME (_ $ B $ D) % SOME (_ $ A $ C) %%
   172             (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   172             (PAxm ("Pure.symmetric", _, _) % _ % _ %%
   173               (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   173               (PAxm ("Pure.combination", _, _) % _ % _ % _ % _ %%
   174                 (PAxm ("Pure.combination", _, _) % SOME (Const ("==", _)) % _ % _ % _ %%
   174                 (PAxm ("Pure.combination", _, _) % SOME (Const ("Pure.eq", _)) % _ % _ % _ %%
   175                   (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2)) %% prf3)) %% prf4) =
   175                   (PAxm ("Pure.reflexive", _, _) % _) %% prf1) %% prf2)) %% prf3)) %% prf4) =
   176           SOME (equal_elim_axm %> B %> A %% (symmetric_axm % ?? A % ?? B %% prf1) %%
   176           SOME (equal_elim_axm %> B %> A %% (symmetric_axm % ?? A % ?? B %% prf1) %%
   177             (equal_elim_axm %> D %> B %% (symmetric_axm % ?? B % ?? D %% prf3) %%
   177             (equal_elim_axm %> D %> B %% (symmetric_axm % ?? B % ?? D %% prf3) %%
   178               (equal_elim_axm %> C %> D %% prf2 %% prf4)))
   178               (equal_elim_axm %> C %> D %% prf2 %% prf4)))
   179 
   179 
   180       | rew' ((prf as PAxm ("Pure.combination", _, _) %
   180       | rew' ((prf as PAxm ("Pure.combination", _, _) %
   181         SOME ((eq as Const ("==", T)) $ t) % _ % _ % _) %%
   181         SOME ((eq as Const ("Pure.eq", T)) $ t) % _ % _ % _) %%
   182           (PAxm ("Pure.reflexive", _, _) % _)) =
   182           (PAxm ("Pure.reflexive", _, _) % _)) =
   183         let val (U, V) = (case T of
   183         let val (U, V) = (case T of
   184           Type (_, [U, V]) => (U, V) | _ => (dummyT, dummyT))
   184           Type (_, [U, V]) => (U, V) | _ => (dummyT, dummyT))
   185         in SOME (prf %% (ax Proofterm.combination_axm [U, V] %> eq % ?? eq % ?? t % ?? t %%
   185         in SOME (prf %% (ax Proofterm.combination_axm [U, V] %> eq % ?? eq % ?? t % ?? t %%
   186           (ax Proofterm.reflexive_axm [T] % ?? eq) %% (ax Proofterm.reflexive_axm [U] % ?? t)))
   186           (ax Proofterm.reflexive_axm [T] % ?? eq) %% (ax Proofterm.reflexive_axm [U] % ?? t)))
   305     val params = Logic.strip_params Q;
   305     val params = Logic.strip_params Q;
   306     val Hs = Logic.strip_assums_hyp P;
   306     val Hs = Logic.strip_assums_hyp P;
   307     val Hs' = Logic.strip_assums_hyp Q;
   307     val Hs' = Logic.strip_assums_hyp Q;
   308     val k = length Hs;
   308     val k = length Hs;
   309     val l = length params;
   309     val l = length params;
   310     fun mk_prf i j Hs Hs' (Const ("all", _) $ Abs (_, _, P)) prf =
   310     fun mk_prf i j Hs Hs' (Const ("Pure.all", _) $ Abs (_, _, P)) prf =
   311           mk_prf i (j - 1) Hs Hs' P (prf %> Bound j)
   311           mk_prf i (j - 1) Hs Hs' P (prf %> Bound j)
   312       | mk_prf i j (H :: Hs) (H' :: Hs') (Const ("==>", _) $ _ $ P) prf =
   312       | mk_prf i j (H :: Hs) (H' :: Hs') (Const ("Pure.imp", _) $ _ $ P) prf =
   313           mk_prf (i - 1) j Hs Hs' P (prf %% un_hhf_proof H' H (PBound i))
   313           mk_prf (i - 1) j Hs Hs' P (prf %% un_hhf_proof H' H (PBound i))
   314       | mk_prf _ _ _ _ _ prf = prf
   314       | mk_prf _ _ _ _ _ prf = prf
   315   in
   315   in
   316     prf |> Proofterm.incr_pboundvars k l |> mk_prf (k - 1) (l - 1) Hs Hs' P |>
   316     prf |> Proofterm.incr_pboundvars k l |> mk_prf (k - 1) (l - 1) Hs Hs' P |>
   317     fold_rev (fn P => fn prf => AbsP ("H", SOME P, prf)) Hs' |>
   317     fold_rev (fn P => fn prf => AbsP ("H", SOME P, prf)) Hs' |>
   322     val params = Logic.strip_params Q;
   322     val params = Logic.strip_params Q;
   323     val Hs = Logic.strip_assums_hyp P;
   323     val Hs = Logic.strip_assums_hyp P;
   324     val Hs' = Logic.strip_assums_hyp Q;
   324     val Hs' = Logic.strip_assums_hyp Q;
   325     val k = length Hs;
   325     val k = length Hs;
   326     val l = length params;
   326     val l = length params;
   327     fun mk_prf (Const ("all", _) $ Abs (s, T, P)) prf =
   327     fun mk_prf (Const ("Pure.all", _) $ Abs (s, T, P)) prf =
   328           Abst (s, SOME T, mk_prf P prf)
   328           Abst (s, SOME T, mk_prf P prf)
   329       | mk_prf (Const ("==>", _) $ P $ Q) prf =
   329       | mk_prf (Const ("Pure.imp", _) $ P $ Q) prf =
   330           AbsP ("H", SOME P, mk_prf Q prf)
   330           AbsP ("H", SOME P, mk_prf Q prf)
   331       | mk_prf _ prf = prf
   331       | mk_prf _ prf = prf
   332   in
   332   in
   333     prf |> Proofterm.incr_pboundvars k l |>
   333     prf |> Proofterm.incr_pboundvars k l |>
   334     fold (fn i => fn prf => prf %> Bound i) (l - 1 downto 0) |>
   334     fold (fn i => fn prf => prf %> Bound i) (l - 1 downto 0) |>