src/Tools/Metis/metis.ML
changeset 74358 6ab3116a251a
parent 72004 913162a47d9f
child 78650 47d0c333d155
equal deleted inserted replaced
74357:41d009462d3c 74358:6ab3116a251a
 12740 val resolve = fn lit => fn pos => fn neg =>
 12740 val resolve = fn lit => fn pos => fn neg =>
 12741     resolve lit pos neg
 12741     resolve lit pos neg
 12742     handle Error err =>
 12742     handle Error err =>
 12743       raise Error ("Metis_Thm.resolve:\nlit = " ^ Metis_Literal.toString lit ^
 12743       raise Error ("Metis_Thm.resolve:\nlit = " ^ Metis_Literal.toString lit ^
 12744                    "\npos = " ^ toString pos ^
 12744                    "\npos = " ^ toString pos ^
 12745                    "\nneg = " ^ toString neg ^ "\n" ^ err);
 12745                    "\nneg = " ^ toString neg ^ "\n" ^ err)
       
 12746          | Bug bug =>
       
 12747       raise Bug ("Metis_Thm.resolve:\nlit = " ^ Metis_Literal.toString lit ^
       
 12748                  "\npos = " ^ toString pos ^
       
 12749                  "\nneg = " ^ toString neg ^ "\n" ^ bug);
 12746 *)
 12750 *)
 12747 
 12751 
 12748 (* ------------------------------------------------------------------------- *)
 12752 (* ------------------------------------------------------------------------- *)
 12749 (*                                                                           *)
 12753 (*                                                                           *)
 12750 (* --------- refl t                                                          *)
 12754 (* --------- refl t                                                          *)
 19450             val (lit',litTh) = mk_literule neq lit
 19454             val (lit',litTh) = mk_literule neq lit
 19451             val lneq = neqConvsAdd order lneq lit'
 19455             val lneq = neqConvsAdd order lneq lit'
 19452             val lits = Metis_LiteralSet.add lits lit'
 19456             val lits = Metis_LiteralSet.add lits lit'
 19453           in
 19457           in
 19454             if Metis_Literal.equal lit lit' then (changed,lneq,lits,th)
 19458             if Metis_Literal.equal lit lit' then (changed,lneq,lits,th)
 19455             else (true, lneq, lits, Metis_Thm.resolve lit th litTh)
 19459             else (true, lneq, lits,
       
 19460                   if Metis_Thm.member lit th then Metis_Thm.resolve lit th litTh else th)
 19456           end
 19461           end
 19457 
 19462 
 19458       fun rewr_neq_lits lits th =
 19463       fun rewr_neq_lits lits th =
 19459           let
 19464           let
 19460             val neqs = buildNeqConvs order lits
 19465             val neqs = buildNeqConvs order lits
 19497       val () = if not (thmReducible order known id result) then ()
 19502       val () = if not (thmReducible order known id result) then ()
 19498                else raise Bug "Metis_Rewrite.rewriteIdRule': should be normalized"
 19503                else raise Bug "Metis_Rewrite.rewriteIdRule': should be normalized"
 19499     in
 19504     in
 19500       result
 19505       result
 19501     end
 19506     end
 19502     handle Error err => raise Error ("Metis_Rewrite.rewriteIdRule':\n" ^ err);
 19507     handle Error err =>
       
 19508       raise Error ("Metis_Rewrite.rewriteIdRule':\n" ^
       
 19509                    "th = " ^ Metis_Thm.toString th ^ "\n" ^ err)
       
 19510          | Bug bug =>
       
 19511       raise Bug ("Metis_Rewrite.rewriteIdRule':\n" ^
       
 19512                  "th = " ^ Metis_Thm.toString th ^ "\n" ^ bug);
 19503 *)
 19513 *)
 19504 
 19514 
 19505 fun rewrIdConv (Metis_Rewrite {known,redexes,...}) order =
 19515 fun rewrIdConv (Metis_Rewrite {known,redexes,...}) order =
 19506     rewrIdConv' order known redexes;
 19516     rewrIdConv' order known redexes;
 19507 
 19517 
 20878 
 20888 
 20879       fun rewrite cl =
 20889       fun rewrite cl =
 20880           let
 20890           let
 20881             val cl' = Metis_Clause.rewrite rewr cl
 20891             val cl' = Metis_Clause.rewrite rewr cl
 20882           in
 20892           in
 20883             if Metis_Clause.equalThms cl cl' then SOME cl else Metis_Clause.simplify cl'
 20893             if Metis_Clause.equalThms cl cl' then SOME cl
       
 20894             else
       
 20895               case Metis_Clause.simplify cl' of
       
 20896                 NONE => NONE
       
 20897               | SOME cl'' =>
       
 20898                 (*                                                         *)
       
 20899                 (* Post-rewrite simplification can enable more rewrites:   *)
       
 20900                 (*                                                         *)
       
 20901                 (*  ~(X = f(X)) \/ ~(g(Y) = f(X)) \/ ~(c = f(X))           *)
       
 20902                 (* ---------------------------------------------- rewrite  *)
       
 20903                 (*  ~(X = f(X)) \/ ~(g(Y) = X) \/ ~(c = X)                 *)
       
 20904                 (* ---------------------------------------------- simplify *)
       
 20905                 (*  ~(g(Y) = f(g(Y))) \/ ~(c = g(Y))                       *)
       
 20906                 (* ---------------------------------------------- rewrite  *)
       
 20907                 (*  ~(c = f(c)) \/ ~(c = g(Y))                             *)
       
 20908                 (*                                                         *)
       
 20909                 (* This was first observed in a bug discovered by Martin   *)
       
 20910                 (* Desharnais and Jasmin Blanchett                         *)
       
 20911                 (*                                                         *)
       
 20912                 if Metis_Clause.equalThms cl' cl'' then SOME cl' else rewrite cl''
 20884           end
 20913           end
 20885     in
 20914     in
 20886       fn cl =>
 20915       fn cl =>
 20887          case Metis_Clause.simplify cl of
 20916          case Metis_Clause.simplify cl of
 20888            NONE => NONE
 20917            NONE => NONE