src/HOL/Decision_Procs/Parametric_Ferrante_Rackoff.thy
changeset 38549 d0385f2764d8
parent 38136 bd4965bb7bdc
child 38558 32ad17fe2b9c
equal deleted inserted replaced
38548:dea0d2cca822 38549:d0385f2764d8
  2958 val disjt = @{term "op |"};
  2958 val disjt = @{term "op |"};
  2959 val impt = @{term "op -->"};
  2959 val impt = @{term "op -->"};
  2960 val ifft = @{term "op = :: bool => _"}
  2960 val ifft = @{term "op = :: bool => _"}
  2961 fun llt rT = Const(@{const_name Orderings.less},rrT rT);
  2961 fun llt rT = Const(@{const_name Orderings.less},rrT rT);
  2962 fun lle rT = Const(@{const_name Orderings.less},rrT rT);
  2962 fun lle rT = Const(@{const_name Orderings.less},rrT rT);
  2963 fun eqt rT = Const("op =",rrT rT);
  2963 fun eqt rT = Const(@{const_name "op ="},rrT rT);
  2964 fun rz rT = Const(@{const_name Groups.zero},rT);
  2964 fun rz rT = Const(@{const_name Groups.zero},rT);
  2965 
  2965 
  2966 fun dest_nat t = case t of
  2966 fun dest_nat t = case t of
  2967   Const (@{const_name Suc}, _) $ t' => 1 + dest_nat t'
  2967   Const (@{const_name Suc}, _) $ t' => 1 + dest_nat t'
  2968 | _ => (snd o HOLogic.dest_number) t;
  2968 | _ => (snd o HOLogic.dest_number) t;
  3013      (@{code Mul} (c, @{code Bound} n), p))
  3013      (@{code Mul} (c, @{code Bound} n), p))
  3014 | _ => error "term_of_tm: Unknown term";
  3014 | _ => error "term_of_tm: Unknown term";
  3015 
  3015 
  3016 fun fm_of_term m m' fm = 
  3016 fun fm_of_term m m' fm = 
  3017  case fm of
  3017  case fm of
  3018     Const("True",_) => @{code T}
  3018     Const(@{const_name "True"},_) => @{code T}
  3019   | Const("False",_) => @{code F}
  3019   | Const(@{const_name "False"},_) => @{code F}
  3020   | Const("Not",_)$p => @{code NOT} (fm_of_term m m' p)
  3020   | Const(@{const_name "Not"},_)$p => @{code NOT} (fm_of_term m m' p)
  3021   | Const("op &",_)$p$q => @{code And} (fm_of_term m m' p, fm_of_term m m' q)
  3021   | Const(@{const_name "op &"},_)$p$q => @{code And} (fm_of_term m m' p, fm_of_term m m' q)
  3022   | Const("op |",_)$p$q => @{code Or} (fm_of_term m m' p, fm_of_term m m' q)
  3022   | Const(@{const_name "op |"},_)$p$q => @{code Or} (fm_of_term m m' p, fm_of_term m m' q)
  3023   | Const("op -->",_)$p$q => @{code Imp} (fm_of_term m m' p, fm_of_term m m' q)
  3023   | Const(@{const_name "op -->"},_)$p$q => @{code Imp} (fm_of_term m m' p, fm_of_term m m' q)
  3024   | Const("op =",ty)$p$q => 
  3024   | Const(@{const_name "op ="},ty)$p$q => 
  3025        if domain_type ty = bT then @{code Iff} (fm_of_term m m' p, fm_of_term m m' q)
  3025        if domain_type ty = bT then @{code Iff} (fm_of_term m m' p, fm_of_term m m' q)
  3026        else @{code Eq} (@{code Sub} (tm_of_term m m' p, tm_of_term m m' q))
  3026        else @{code Eq} (@{code Sub} (tm_of_term m m' p, tm_of_term m m' q))
  3027   | Const(@{const_name Orderings.less},_)$p$q => 
  3027   | Const(@{const_name Orderings.less},_)$p$q => 
  3028         @{code Lt} (@{code Sub} (tm_of_term m m' p, tm_of_term m m' q))
  3028         @{code Lt} (@{code Sub} (tm_of_term m m' p, tm_of_term m m' q))
  3029   | Const(@{const_name Orderings.less_eq},_)$p$q => 
  3029   | Const(@{const_name Orderings.less_eq},_)$p$q => 
  3030         @{code Le} (@{code Sub} (tm_of_term m m' p, tm_of_term m m' q))
  3030         @{code Le} (@{code Sub} (tm_of_term m m' p, tm_of_term m m' q))
  3031   | Const("Ex",_)$Abs(xn,xT,p) => 
  3031   | Const(@{const_name "Ex"},_)$Abs(xn,xT,p) => 
  3032      let val (xn', p') =  variant_abs (xn,xT,p)
  3032      let val (xn', p') =  variant_abs (xn,xT,p)
  3033          val x = Free(xn',xT)
  3033          val x = Free(xn',xT)
  3034          fun incr i = i + 1
  3034          fun incr i = i + 1
  3035          val m0 = (x,0):: (map (apsnd incr) m)
  3035          val m0 = (x,0):: (map (apsnd incr) m)
  3036       in @{code E} (fm_of_term m0 m' p') end
  3036       in @{code E} (fm_of_term m0 m' p') end
  3037   | Const("All",_)$Abs(xn,xT,p) => 
  3037   | Const(@{const_name "All"},_)$Abs(xn,xT,p) => 
  3038      let val (xn', p') =  variant_abs (xn,xT,p)
  3038      let val (xn', p') =  variant_abs (xn,xT,p)
  3039          val x = Free(xn',xT)
  3039          val x = Free(xn',xT)
  3040          fun incr i = i + 1
  3040          fun incr i = i + 1
  3041          val m0 = (x,0):: (map (apsnd incr) m)
  3041          val m0 = (x,0):: (map (apsnd incr) m)
  3042       in @{code A} (fm_of_term m0 m' p') end
  3042       in @{code A} (fm_of_term m0 m' p') end
  3043   | _ => error "fm_of_term";
  3043   | _ => error "fm_of_term";
  3044 
  3044 
  3045 
  3045 
  3046 fun term_of_fm T m m' t = 
  3046 fun term_of_fm T m m' t = 
  3047   case t of
  3047   case t of
  3048     @{code T} => Const("True",bT)
  3048     @{code T} => Const(@{const_name "True"},bT)
  3049   | @{code F} => Const("False",bT)
  3049   | @{code F} => Const(@{const_name "False"},bT)
  3050   | @{code NOT} p => nott $ (term_of_fm T m m' p)
  3050   | @{code NOT} p => nott $ (term_of_fm T m m' p)
  3051   | @{code And} (p,q) => conjt $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)
  3051   | @{code And} (p,q) => conjt $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)
  3052   | @{code Or} (p,q) => disjt $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)
  3052   | @{code Or} (p,q) => disjt $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)
  3053   | @{code Imp} (p,q) => impt $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)
  3053   | @{code Imp} (p,q) => impt $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)
  3054   | @{code Iff} (p,q) => ifft $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)
  3054   | @{code Iff} (p,q) => ifft $ (term_of_fm T m m' p) $ (term_of_fm T m m' q)