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; |