src/HOL/Tools/Qelim/cooper.ML
changeset 29787 23bf900a21db
parent 29265 5b4247055bd7
child 30304 d8e4cd2ac2a1
equal deleted inserted replaced
29786:84a3f86441eb 29787:23bf900a21db
   556   | Const(@{const_name HOL.less},_)$t1$t2 => Lt (Sub (i_of_term vs t1,i_of_term vs t2))
   556   | Const(@{const_name HOL.less},_)$t1$t2 => Lt (Sub (i_of_term vs t1,i_of_term vs t2))
   557   | Const(@{const_name HOL.less_eq},_)$t1$t2 => Le (Sub(i_of_term vs t1,i_of_term vs t2))
   557   | Const(@{const_name HOL.less_eq},_)$t1$t2 => Le (Sub(i_of_term vs t1,i_of_term vs t2))
   558   | Const(@{const_name Ring_and_Field.dvd},_)$t1$t2 => 
   558   | Const(@{const_name Ring_and_Field.dvd},_)$t1$t2 => 
   559       (Dvd(HOLogic.dest_number t1 |> snd, i_of_term vs t2) handle _ => cooper "Reification: unsupported dvd")  (* FIXME avoid handle _ *)
   559       (Dvd(HOLogic.dest_number t1 |> snd, i_of_term vs t2) handle _ => cooper "Reification: unsupported dvd")  (* FIXME avoid handle _ *)
   560   | @{term "op = :: int => _"}$t1$t2 => Eq (Sub (i_of_term vs t1,i_of_term vs t2))
   560   | @{term "op = :: int => _"}$t1$t2 => Eq (Sub (i_of_term vs t1,i_of_term vs t2))
   561   | @{term "op = :: bool => _ "}$t1$t2 => Iffa(qf_of_term ps vs t1,qf_of_term ps vs t2)
   561   | @{term "op = :: bool => _ "}$t1$t2 => Iff(qf_of_term ps vs t1,qf_of_term ps vs t2)
   562   | Const("op &",_)$t1$t2 => And(qf_of_term ps vs t1,qf_of_term ps vs t2)
   562   | Const("op &",_)$t1$t2 => And(qf_of_term ps vs t1,qf_of_term ps vs t2)
   563   | Const("op |",_)$t1$t2 => Or(qf_of_term ps vs t1,qf_of_term ps vs t2)
   563   | Const("op |",_)$t1$t2 => Or(qf_of_term ps vs t1,qf_of_term ps vs t2)
   564   | Const("op -->",_)$t1$t2 => Impa(qf_of_term ps vs t1,qf_of_term ps vs t2)
   564   | Const("op -->",_)$t1$t2 => Imp(qf_of_term ps vs t1,qf_of_term ps vs t2)
   565   | Const (@{const_name Not},_)$t' => Nota(qf_of_term ps vs t')
   565   | Const (@{const_name Not},_)$t' => Not(qf_of_term ps vs t')
   566   | Const("Ex",_)$Abs(xn,xT,p) => 
   566   | Const("Ex",_)$Abs(xn,xT,p) => 
   567      let val (xn',p') = variant_abs (xn,xT,p)
   567      let val (xn',p') = variant_abs (xn,xT,p)
   568          val vs' = (Free (xn',xT), 0) :: (map (fn(v,n) => (v,1+ n)) vs)
   568          val vs' = (Free (xn',xT), 0) :: (map (fn(v,n) => (v,1+ n)) vs)
   569      in E (qf_of_term ps vs' p')
   569      in E (qf_of_term ps vs' p')
   570      end
   570      end
   606   | Neg t' => @{term "uminus :: int => _"} $ term_of_i vs t'
   606   | Neg t' => @{term "uminus :: int => _"} $ term_of_i vs t'
   607   | Add (t1, t2) => @{term "op + :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   607   | Add (t1, t2) => @{term "op + :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   608   | Sub (t1, t2) => @{term "op - :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   608   | Sub (t1, t2) => @{term "op - :: int => _"} $ term_of_i vs t1 $ term_of_i vs t2
   609   | Mul (i, t2) => @{term "op * :: int => _"} $
   609   | Mul (i, t2) => @{term "op * :: int => _"} $
   610       HOLogic.mk_number HOLogic.intT i $ term_of_i vs t2
   610       HOLogic.mk_number HOLogic.intT i $ term_of_i vs t2
   611   | Cx (i, t') => term_of_i vs (Add (Mul (i, Bound 0), t'));
   611   | Cn (n, i, t') => term_of_i vs (Add (Mul (i, Bound n), t'));
   612 
   612 
   613 fun term_of_qf ps vs t = 
   613 fun term_of_qf ps vs t = 
   614  case t of 
   614  case t of 
   615    T => HOLogic.true_const 
   615    T => HOLogic.true_const 
   616  | F => HOLogic.false_const
   616  | F => HOLogic.false_const
   617  | Lt t' => @{term "op < :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   617  | Lt t' => @{term "op < :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   618  | Le t' => @{term "op <= :: int => _ "}$ term_of_i vs t' $ @{term "0::int"}
   618  | Le t' => @{term "op <= :: int => _ "}$ term_of_i vs t' $ @{term "0::int"}
   619  | Gt t' => @{term "op < :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   619  | Gt t' => @{term "op < :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   620  | Ge t' => @{term "op <= :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   620  | Ge t' => @{term "op <= :: int => _ "}$ @{term "0::int"}$ term_of_i vs t'
   621  | Eq t' => @{term "op = :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   621  | Eq t' => @{term "op = :: int => _ "}$ term_of_i vs t'$ @{term "0::int"}
   622  | NEq t' => term_of_qf ps vs (Nota (Eq t'))
   622  | NEq t' => term_of_qf ps vs (Not (Eq t'))
   623  | Dvd(i,t') => @{term "op dvd :: int => _ "} $ 
   623  | Dvd(i,t') => @{term "op dvd :: int => _ "} $ 
   624     HOLogic.mk_number HOLogic.intT i $ term_of_i vs t'
   624     HOLogic.mk_number HOLogic.intT i $ term_of_i vs t'
   625  | NDvd(i,t')=> term_of_qf ps vs (Nota(Dvd(i,t')))
   625  | NDvd(i,t')=> term_of_qf ps vs (Not(Dvd(i,t')))
   626  | Nota t' => HOLogic.Not$(term_of_qf ps vs t')
   626  | Not t' => HOLogic.Not$(term_of_qf ps vs t')
   627  | And(t1,t2) => HOLogic.conj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   627  | And(t1,t2) => HOLogic.conj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   628  | Or(t1,t2) => HOLogic.disj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   628  | Or(t1,t2) => HOLogic.disj$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   629  | Impa(t1,t2) => HOLogic.imp$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   629  | Imp(t1,t2) => HOLogic.imp$(term_of_qf ps vs t1)$(term_of_qf ps vs t2)
   630  | Iffa(t1,t2) => @{term "op = :: bool => _"} $ term_of_qf ps vs t1 $ term_of_qf ps vs t2
   630  | Iff(t1,t2) => @{term "op = :: bool => _"} $ term_of_qf ps vs t1 $ term_of_qf ps vs t2
   631  | Closed n => the (myassoc2 ps n)
   631  | Closed n => the (myassoc2 ps n)
   632  | NClosed n => term_of_qf ps vs (Nota (Closed n))
   632  | NClosed n => term_of_qf ps vs (Not (Closed n))
   633  | _ => cooper "If this is raised, Isabelle/HOL or generate_code is inconsistent!";
   633  | _ => cooper "If this is raised, Isabelle/HOL or code generator is inconsistent!";
   634 
   634 
   635 fun cooper_oracle ct =
   635 fun cooper_oracle ct =
   636   let
   636   let
   637     val thy = Thm.theory_of_cterm ct;
   637     val thy = Thm.theory_of_cterm ct;
   638     val t = Thm.term_of ct;
   638     val t = Thm.term_of ct;